【问题标题】:Queryset filtering on Foreignkey in ModelformModelform中外键的查询集过滤
【发布时间】:2016-11-30 12:39:27
【问题描述】:

我在保存模型表单时遇到了一个奇怪的问题。我有一个表格,它由两个模型表格组成,我试图同时保存它们。为了清楚起见,下面是我的代码

Views.py

def create_user(request):
    if request.method == 'POST':
        user_form = UserForm(request.POST)
        my_user_form = MyUsersForm(request.POST)

        if user_form.is_valid() and my_user_form.is_valid():
           us = user_form.save()
           my_us = my_user_form.save(commit=False)
           my_us.user = us
           my_us.save()
           return HttpResponse('You have successfully created a user')
        else:
            return HttpResponse(' My_user_form is not validated')

    else:
         user_form = UserForm()
         my_user_form = MyUsersForm(user=request.user)
         return render(request, 'create_user.html', {'user_form': user_form, 'my_user_form': my_user_form})
当我覆盖 MyUsersForm 的 init 方法以过滤外键的查询集(created_by)时,

my_user_form 未被验证,但是当我不过滤查询集时,my_user_form 被验证并且表单是已保存。

我不明白的是,当我不过滤查询集时,my_user_form 是如何被验证的?

通过 request.post 发送到 my_user_form 的数据以某种方式丢失(当我过滤查询集时)。任何正确方向的线索都受到高度赞赏。感谢您的宝贵意见。

Forms.py

class MyUsersForm(ModelForm):

    class Meta:
        model = MyUsers
        fields = ['created_by', ]

    def __init__(self, user=None, **kwargs):
        super(MyUsersForm, self).__init__(**kwargs)
        if user is not None:
            self.fields['created_by'].queryset = User.objects.filter(username=user)

Models.py

class MyUsers(models.Model):
    user = models.OneToOneField(User, blank=True, null=True)
    created_by = models.ForeignKey(User, related_name="created_by", blank=True, null=True)

【问题讨论】:

  • 未验证是什么意思?您要验证什么?
  • 我正在尝试验证发送到 my_user_form = MyUsersForm(request.POST) 的数据,这基本上是一个用户对象。不幸的是,用户对象没有得到验证(即使用户在数据库中并显示在获取请求的下拉菜单中。)谢谢。

标签: django django-models django-forms django-views


【解决方案1】:
def create_user(request):
    if request.method == 'POST':
        user_form = UserForm(request.POST)
        my_user_form = MyUsersForm(request.POST)

        if user_form.is_valid() and my_user_form.is_valid() and User.objects.filter(username=request.POST.get('user')).exists():
           us = user_form.save()
           my_us = my_user_form.save(commit=False)
           my_us.user = us
           my_us.save()
           return HttpResponse('You have successfully created a user')
        else:
            return HttpResponse(' My_user_form is not validated')

    else:
         user_form = UserForm()
         my_user_form = MyUsersForm(user=request.user)
         return render(request, 'create_user.html', {'user_form': user_form, 'my_user_form': my_user_form})

【讨论】:

  • 您可以编写一个干净的方法或在您可以检查的视图中
  • User.objects.filter(username=request.POST.get('user')).exists() 仅检查用户是否在数据库中。在我的例子中,用户是数据库,他通过身份验证来执行他的任务。关于编写 clean 方法的任何意见?
  • 在你的表单中你可以写一个干净的方法来验证
  • def clean(self): username = self.cleaned_data['user'] if User.objects.filter(username__iexact=username).exists(): raise ValidationError(u'%s already exists' % 用户名)
  • 你可以试试@login_required 装饰器,它对用户进行身份验证,所以如果你已经登录,那么只有它允许执行操作
【解决方案2】:

为什么 my_user_form 没有经过验证和保存。我没有在 init 中修改查询集,而是在 view 本身中使用语句

my_user_form.fields['created_by'] = forms.ModelChoiceField(User.objects.filter(username=request.user))

这解决了我的问题。但我仍然不知道为什么它在 MyUsersForm 的 init 方法中不起作用?

【讨论】:

    猜你喜欢
    • 2013-09-05
    • 1970-01-01
    • 2013-09-17
    • 2019-09-06
    • 2020-10-22
    • 2016-07-07
    • 2014-01-08
    • 2020-06-22
    • 2019-10-30
    相关资源
    最近更新 更多