【发布时间】:2019-08-28 14:00:49
【问题描述】:
我有一个在 ModelForm 上运行的 CreateView,它是模型 Item 的子类。 Item.author = ForeignKey(User,on_delete=models.CASCADE,)
在 CreateView 中,用户填写了大部分表单,但我希望将 Item.author 设置为 request.user。每当我这样做时,使用 form_valid() 设置 form.instance.author = self.request.user,我得到一个错误,说“列“author_id”中的空值违反非空约束”
我尝试从 form.py 中删除“作者”作为要编辑的字段。
这就是我想要复制的内容: https://docs.djangoproject.com/en/2.1/topics/class-based-views/generic-editing/#models-and-request-user
模型.py
class Item(models.Model):
# SOME OTHER FIELDS WHICH RENDER AND SAVE FINE
author = models.ForeignKey(User,
on_delete=models.CASCADE,
def get_absolute_url(self):
return reverse('item_detail',args=[str(self.id)])
)
forms.py
class SubmitItemForm(forms.ModelForm):
class Meta():
model = Item
fields = ('link','title','excerpt','type','author')
def __init__(self, *args, **kwargs):
super(SubmitItemForm, self).__init__(*args, **kwargs)
self.helper = FormHelper(self)
self.helper.form_id = 'submit_item'
self.helper.form_class = 'submit'
self.helper.form_method = 'post'
self.helper.form_action = 'item_detail'
self.helper.add_input(Submit('submit', 'Submit'))
views.py
class SubmitItem(LoginRequiredMixin, generic.CreateView):
login_url = '/login/'
redirect_field_name = 'item_detail.html'
form_class = SubmitItemForm
model = Item
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
def form_invalid(self, form):
response = super().form_invalid(form)
return response
我希望表单保存到数据库,并使用 Item 模型中描述的 get_absolute_url() 方法将浏览器重定向到保存的数据。
【问题讨论】: