Django Modelform中Foreignkey上的Queryset筛选
我在保存模型表单时遇到了一个奇怪的问题。我有一个表单,它由两个模型表单组成,我试图同时保存它们。为了清楚起见,下面是我的代码 视图.pyDjango 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
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请求的下拉菜单中)。谢谢。