假设我有一个使用ModelForm添加新日历事件的CreateView。有时,添加新的日历事件时,必须在新事件之前添加另一个日历事件,以便能够成功验证新事件(发生在ModelForm.clean()方法中)。我认为可以在验证新事件的验证之前,在clean方法中添加此其他事件的唯一位置。我对吗,这是我唯一可以做的地方?我想让用户知道这是使用Django消息发生的,但是我当然无法访问ModelForm中的请求对象。这使我认为我必须将该事件添加到另一个位置。哪种CreateView方法适合此目的?
对于英语,如果我的问题措辞不够好,我感到抱歉。预先感谢。
答案 0 :(得分:0)
如果您确实希望访问表单中的请求对象,则可以在CreateView中覆盖get_form_kwargs
方法(这将在表单的clean方法中提供对self.request的访问):
class YourViewName(CreateView):
def get_form_kwargs(self):
kwargs = super(YourViewName, self).get_form_kwargs()
kwargs.update({'request': self.request})
return kwargs
但是,对于您的方案,最好在视图中的form_valid方法内进行验证。如果验证失败,则可以设置消息,然后调用form_invalid()来重新呈现带有错误消息的表单。
class YourViewName(CreateView):
def form_valid(self, form):
if not your_check_goes_here():
messages.error(self.request, _("Form is Invalid"))
return self.form_invalid(form)
return super(YourViewName, self).form_valid(form)
答案 1 :(得分:0)
如果您不使用ModelForm,而是使用自定义表单,则可以更好地控制操作。然后,您可以将请求传递给表单,并在清理过程中使用它。
以下是我的其中一个表单的示例,我需要访问该请求以保存表单内容:
class RatifyQuestionForm(forms.Form):
...
...
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request')
....
....
def save(self):
data = self.cleaned_data
# create approval record
ratification = Ratification.objects.create(
assessment=data['assessment'],
alternative=data['alternative'],
author=request.user)
以类似的方式,您可以通过clean方法访问self.request。
您可以在视图中实例化表单:
if request.method == 'POST':
form = RatifyQuestionForm(request.POST, request=request)