【问题标题】: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 错误。 理想情况下,我们排除了我们不想在创建/更新视图中触摸的字段,但是有没有办法在模板中显示这些字段而不会出现错误?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-28
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        • 1970-01-01
        • 2021-03-27
        相关资源
        最近更新 更多