在基于Django类的视图中验证唯一性字段
我需要排除表单中的“user”字段,因为“user”是将添加模型的loggedin用户。阅读所有Django表格文档并参考此处的答案后 My django views.py仍然报告错误,其中“user”是登录用户在基于Django类的视图中验证唯一性字段,django,Django,我需要排除表单中的“user”字段,因为“user”是将添加模型的loggedin用户。阅读所有Django表格文档并参考此处的答案后 My django views.py仍然报告错误,其中“user”是登录用户 Request Method: POST Request URL: http://localhost:8080/flavor/add_flavor/ Django Version: 1.8 Exception Type: KeyError Exception Value: 'us
Request Method: POST
Request URL: http://localhost:8080/flavor/add_flavor/
Django Version: 1.8
Exception Type: KeyError
Exception Value: 'user'
有人能指出我代码中的错误吗
models.py
class Flavor(models.Model):
user = models.ForeignKey(UserProfile, related_name='flavors', verbose_name=_('user'))
# Attributes
name = models.CharField(max_length=100, verbose_name=_('name'), help_text=_('Enter the flavor name'))
date_created = models.DateField(_("date created"), default=datetime.date.today)
class Meta:
verbose_name = _('Flavor')
verbose_name_plural = _('Flavors')
ordering = ('name', 'user')
unique_together = ('user', 'name')
forms.py
class FlavorForm(forms.ModelForm):
class Meta:
model = Flavor
# Never use exclude keyword which involves Massive Assignment Risk
fields = ('name', 'date_created')
def __init__(self, *args, **kwargs):
# set the user as an attribute of the form which is more robust
# Always pop user from kwargs before calling super()
self.user = kwargs.pop('user')
super(FlavorForm, self).__init__(*args, **kwargs)
def clean(self):
'''
To verify the uniqueness by the unique_together fields
'''
cleaned_data = super(FlavorForm, self).clean()
if Flavor.objects.filter(name=cleaned_data.get('name',''), user=self.user).exists():
raise ValidationError(_('You have already added a flavor with this name'), code='invalid')
# Always return cleaned data
return cleaned_data
views.py
class FlavorCreateView(LoginRequiredMixin, CreateView):
model = Flavor
form_class = FlavorForm
template_name = 'flavor/add_flavor.html'
view_name = 'add_flavor'
success_url = reverse_lazy(view_name)
def get_form_kwargs(self):
'''
This injects form with keyword arguments.
'''
kwargs = super(FlavorCreateView, self).get_form_kwargs()
#Update the kwargs with the user_id
kwargs['user'] = self.request.user
return kwargs
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
if form.is_valid():
form.save()
# process cleaned data
return HttpResponseRedirect(success_url)
return render(request, self.template_name, {'form': form})
您已经仔细定义了
get\u form\u kwargs
以提供用户kwarg。但是由于某种原因,您已经覆盖了post
;您的版本直接实例化表单,忽略帮助器方法
在CBV中很少有理由覆盖post
,当然在您的案例中也没有。删除整个方法
(注意,这与检查唯一性无关。)您已经仔细定义了
get\u form\u kwargs
以提供用户kwarg。但是由于某种原因,您已经覆盖了post
;您的版本直接实例化表单,忽略帮助器方法
在CBV中很少有理由覆盖post
,当然在您的案例中也没有。删除整个方法
(注意,这与检查唯一性无关。)我删除了post方法并覆盖了FlavorForm中的clean方法以获得唯一性。我删除了post方法并覆盖了FlavorForm中的clean方法以获得唯一性。嗨,Daniel,谢谢你回答我的问题。)我花了好几天时间在这上面。我照你说的做了,例外消失了。但是,如何验证一个用户没有通过表单再次添加相同的味道?也就是说,由于“用户”字段被排除在FlavorForm之外,如何验证模型Flavor中的唯一_呢?我不太确定你在问什么;这就是您在
clean
中使用实例化时传入的user
kwarg明确执行的操作。嗨,Daniel,谢谢您回答我的问题。:)我花了好几天时间在这上面。我照你说的做了,例外消失了。但是,如何验证一个用户没有通过表单再次添加相同的味道?也就是说,由于“用户”字段被排除在FlavorForm之外,如何验证模型Flavor中的唯一_呢?我不太确定你在问什么;这就是您在clean
中使用实例化时传入的user
kwarg显式执行的操作。