(Django)UpdateVi中当前用户的有限外键选择

2024-10-02 18:14:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近在CreateView中找到了如何做到这一点,但UpdateView却没有找到同样的方法(以下是关于如何在CreateView中做到这一点的原始文章:(Django) Limited ForeignKey choices by Current User

本质上,我需要它只显示当前登录用户创建的universe,但默认情况下,它显示所有universe。 当我试图设置一个form\u类并让它模仿CreatView的解决方案时,它会抛出一个配置不正确的错误

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 UpdateCharacter(LoginRequiredMixin,generic.UpdateView):
     model = Character
     fields = ('universe','name')
     template_name = 'character_developer/character_update_form.html'

更新 错误是:

错误:在/characters/update/3处配置不正确/ UpdateCharacter缺少QuerySet。定义UpdateCharacter.model、UpdateCharacter.queryset或重写UpdateCharacter.get\u queryset()

下面是得到错误的代码:

视图.py:

class UpdateCharacter(LoginRequiredMixin,generic.UpdateView):
    template_name = 'character_developer/character_update_form.html'
    form_class = UpdateForm

    def get_form_kwargs(self):
        kwargs = super(UpdateCharacter,self).get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

表单.py

class UpdateForm(forms.ModelForm):
    def __init__(self,*args,**kwargs):
        user = kwargs.pop('user')
        super(UpdateForm,self).__init__(*args,**kwargs)
        self.fields['universe'].queryset = Universe.objects.filter(user=user)

    class Meta:
        model = Character
        fields = ('universe','name')

Tags: nameselfformgetreturnmodelsdef错误
1条回答
网友
1楼 · 发布于 2024-10-02 18:14:20

我相信在views.py(几乎是CreateCharacter的精确扩展)中需要以下内容:

class UpdateCharacter(LoginRequiredMixin, generic.UpdateView):
    model = Character
    template_name ='character_developer/character_create.html'
    form_class = UpdateForm

    def get_form_kwargs(self):
        kwargs = super(UpdateCharacter,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)

我要警告上面提到的-确保请求对象中的用户实例是当前登录用户的实例,并且有足够的权限更新他们自己的用户-并且不能以某种方式代表他们发出请求

相关问题 更多 >