(Django)当前用户的有限ForeignKey选择 [英] (Django) Limited ForeignKey choices by Current User

查看:61
本文介绍了(Django)当前用户的有限ForeignKey选择的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

更新

多亏了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆