(Django)当前用户限制的ForeignKey选择

时间:2018-08-28 18:47:07

标签: python django

更新

感谢Michael,我能够使它在我的CreateView中完美运行,但在UpdateView中却无法正常运行。当我尝试设置form_class时,它会弹出错误配置的错误。

如何在更新视图中过滤外键?

结束更新

我觉得这里缺少一些小东西,但是我已经做了一段时间了,无法解决。

我有一个名为Story Universe的应用程序,用户可以在其中创建一个带有名称和描述的应用程序。

然后我有一个角色创建者类,用户可以在其中创建该Universe中的角色。这一切都很好,除了用户创建角色时,他们会看到所有用户创建的所有Universe的列表。

然后还有其他应用程序也将模仿我与角色创建者的尝试。

我需要将Story Universe限制为仅由当前登录用户创建的Story Universe。

我尝试了几种不同的方法,并在以下方面获得了最大的成功,但是使用此代码,尝试创建新角色时没有Universe出现。

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')

1 个答案:

答案 0 :(得分:2)

您需要对CreateForm中的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字段中,但仅适用于当前登录的用户。