Django Modelform中Foreignkey上的Queryset筛选

Django Modelform中Foreignkey上的Queryset筛选,django,django-models,django-forms,django-views,Django,Django Models,Django Forms,Django 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

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

视图.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})
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)
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)
当我重写MyUsersForm的init方法以过滤外键(创建者)的查询集时,my_user_表单不会被验证,但当我不过滤查询集时,my_user_表单会被验证并保存表单

我不明白的是,当我不过滤查询集时,我的用户表单是如何被验证的

通过request.post发送到我的_user_表单的数据不知何故丢失了(当我过滤查询集时)。任何方向正确的线索都将受到高度赞赏。感谢您的宝贵意见

Forms.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})
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)
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)
型号.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})
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)
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)

为什么我的用户表单未被验证和保存。我没有在init中修改queryset,而是在视图中使用语句修改它

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

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

为什么我的用户表单未被验证和保存。我没有在init中修改queryset,而是在视图中使用语句修改它

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

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

可以编写干净的方法,也可以在视图中检查user.objects.filter(username=request.POST.get('user'))。exists()仅检查数据库中的用户。在我的例子中,用户就是数据库,他被认证来执行他的任务。关于编写clean方法的任何输入?在表单中,您可以编写一个clean方法来验证def clean(self):username=self.cleaned_data['user']if user.objects.filter(username_uiexact=username.exists():引发ValidationError(u'%s已经存在'%username'))您可以尝试使用@login\u required decorator对用户进行身份验证,因此如果您已登录,则仅允许它执行操作您可以编写一个干净的方法,或者在视图中检查user.objects.filter(username=request.POST.get('user'))。exists()仅检查用户是否在数据库中。在我的例子中,用户就是数据库,他被认证来执行他的任务。关于编写clean方法的任何输入?在表单中,您可以编写一个clean方法来验证def clean(self):username=self.cleaned_data['user']if user.objects.filter(username_uiexact=username.exists():引发ValidationError(u'%s已经存在'%username'))您可以尝试@login\u required decorator,该decorator对用户进行身份验证。因此,如果您已登录,则仅允许它执行操作。您所说的未验证是什么意思?你想验证什么?我想验证发送给我的用户表单=MyUsersForm(request.POST)的数据,它基本上是一个用户对象。不幸的是,用户对象没有得到验证(即使用户在数据库中并且显示在get请求的下拉菜单中)。谢谢。你说的未验证是什么意思?你想验证什么?我想验证发送给我的用户表单=MyUsersForm(request.POST)的数据,它基本上是一个用户对象。不幸的是,用户对象没有得到验证(即使用户在数据库中并且显示在get请求的下拉菜单中)。谢谢。