【问题标题】:CreateView doesn't save object , throws 'this field is required ' errorCreateView 不保存对象,抛出 \'this field is required \' 错误
【发布时间】:2022-11-07 16:40:19
【问题描述】:
models.py 是:
class Todo(models.Model):
user=models.ForeignKey(User,on_delete=models.CASCADE,null=True,blank=True)
title=models.CharField(max_length=200)
desc=models.TextField(null=True,blank=True)
complete=models.BooleanField(default=False)
created=models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
class Meta:
ordering = ['created']
view.py 是:
class TaskCreate(generic.CreateView):
model = Todo
fields = '__all__'
template_name = 'create.html'
success_url = reverse_lazy('home')
create.html 是:
<body>
<a href="{% url 'home' %}">go back</a>
{{ form.as_p }}
<form method="post">
{% csrf_token %}
<input type="submit" value="submit">
</form>
</body>
每当我从 create.html 表单提交数据时,它都不会将其保存到数据库中,而是在“用户”字段中抛出该字段是必需的。我该如何解决这个问题?
【问题讨论】:
标签:
django
django-views
create-view
【解决方案1】:
您可能希望排除 user 字段,因为它是由登录用户确定的,因此:
from django.conf import settings
class Todo(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL, on_delete=models.CASCADE, editable=False
)
# …
def __str__(self):
return self.title
class Meta:
ordering = ['created']
然后我们将登录的用户注入到表单的实例中:
from django.contrib.auth.mixins import LoginRequiredMixin
class TaskCreateView(LoginRequiredMixin, generic.CreateView):
model = Todo
fields = '__all__'
template_name = 'create.html'
success_url = reverse_lazy('home')
def form_valid(self, form):
form.instance.user = request.user
return super().form_valid(form)
笔记: 通常使用settings.AUTH_USER_MODEL [Django-doc] 引用用户模型比直接使用User model [Django-doc] 更好。有关更多信息,您可以查看referencing the User model section of the documentation。
笔记:您可以将视图限制为基于类的视图,以便通过身份验证的用户使用
LoginRequiredMixin mixin [Django-doc]。
笔记:在 Django 中,基于类的视图 (CBV) 通常具有 …View 后缀,以避免与模型名称发生冲突。
因此,您可以考虑将视图类重命名为 TaskCreateView,而不是TaskCreate.
【解决方案2】:
我有一个类似的问题。
我的模型中有一些default 字段,我仍然想在模板中显示它们,即使模板中显示了字段的默认值,它也会抛出This field is required 错误。
理想情况下,我们排除了我们不想在创建/更新视图中触摸的字段,但是有没有办法在模板中显示这些字段而不会出现错误?