(Django)当前用户的有限ForeignKey选择 [英] (Django) Limited ForeignKey choices by Current User
问题描述
更新
多亏了Michael,我能够使它在我的CreateView中完美运行,但在UpdateView中却无法正常工作.当我尝试设置form_class时,它会吐出一个配置错误的错误.
Thanks to Michael I was able to get this to work perfectly in my CreateView, but not in the UpdateView. When I try to set a form_class it spits out an improperly configured error.
如何在updateview中过滤ForeignKey?
How can I go about filtering the ForeignKey in the updateview?
结束更新
我感觉这里缺少一些小东西,但是我已经做了一段时间了,无法解决.
I have a feeling I'm missing something small here but I've been working on it for a while and can't figure it out.
我有一个名为Story Universe的应用程序,用户可以在其中创建一个带有名称和描述的应用程序.
I have an app called story universe where the user creates one with a name and description.
然后我有一个角色创建者类,用户可以在其中创建该Universe中的角色.这一切都很好,除了用户创建角色时,他们会看到所有用户创建的所有Universe的列表.
I then have a character creator class where the user can create a character within that universe. This all works fine, except when the user goes to create their character they see a list of all universes created by all users.
然后还有其他应用程序也将模仿我与角色创建者的尝试.
Then there are other apps that will also mimic what I'm trying to do with the character creator.
我需要将Story Universe限制为仅由当前登录用户创建的Story Universe.
I need to limit the Story Universes to only those created by the currently logged in user.
我尝试了几种不同的方法,并且在以下方面获得了最大的成功,但是使用此代码,尝试创建新角色时没有Universe出现.
I've tried a few different ways and had the most success with the following, but with this code, no Universe appears when trying to create a new character.
models.py
:
class Universe(models.Model):
user = models.ForeignKey(User,related_name='universe',on_delete=models.CASCADE)
name = models.CharField(max_length=100, unique=True)
description = models.TextField(max_length=2000,blank=True,default="")
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('universe:singleuniverse',kwargs={'pk': self.pk})
class Meta:
ordering = ['name']
unique_together = ['user','name']
class Character(models.Model):
user = models.ForeignKey(User,related_name='characters',on_delete=models.CASCADE)
universe = models.ForeignKey("story_universe.Universe", on_delete=models.CASCADE)
name = models.CharField(max_length=255,unique=True)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('character_developer:singlecharacter',kwargs={'pk': self.pk})
class Meta():
ordering = ['name']
unique_together=['user','name']
views.py
:
class CreateCharacter(LoginRequiredMixin,generic.CreateView):
template_name ='character_developer/character_create.html'
form_class = CreateForm
def get_form_kwargs(self):
kwargs = super(CreateCharacter,self).get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
def form_valid(self,form):
self.object = form.save(commit=False)
self.object.user = self.request.user
self.object.save
return super().form_valid(form)
forms.py
:
class CreateForm(forms.ModelForm):
def __init__(self,*args,**kwargs):
user = kwargs.pop('user')
super(CreateForm,self).__init__(*args,**kwargs)
self.fields['universe'].queryset = Character.objects.filter(user=user)
class Meta:
model = Character
fields = ('universe','name')
推荐答案
您需要对 forms.py
中的 CreateForm
类进行一些更改:>
You need to make a slight change to the CreateForm
class in your forms.py
:
class CreateForm(forms.ModelForm):
def __init__(self,*args,**kwargs):
user = kwargs.pop('user')
super(CreateForm,self).__init__(*args,**kwargs)
self.fields['universe'].queryset = Universe.objects.filter(user=user)
class Meta:
model = Character
fields = ('universe','name')
这将把返回的 Universe
对象拉入Universe字段,但仅适用于当前登录的用户.
That will then pull through the returned Universe
objects into the universe field, but only for the currently logged in user.
这篇关于(Django)当前用户的有限ForeignKey选择的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!