簡體   English   中英

CreateView 不保存 object,拋出 'this field is required' 錯誤

[英]CreateView doesn't save object , throws 'this field is required ' error

模型.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 表單提交數據時,它不會將其保存到數據庫並在“用戶”字段中拋出此字段是必需的。 我該如何解決這個問題?

您可能想要排除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]來引用用戶 model,而不是直接使用User模型[Django-doc] 有關更多信息,您可以查看參考文檔的User model部分


注意:您可以使用LoginRequiredMixin mixin [Django-doc]將視圖限制為基於類的視圖,以供經過身份驗證的用戶使用。


注意:在 Django 中,基於類的視圖 (CBV) 通常有一個…View后綴,以避免與 model 名稱發生沖突。 因此,您可以考慮將視圖 class 重命名為TaskCreateView ,而不是TaskCreate

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM