CreateView не сохраняет объект, выкидывает ошибку 'это поле обязательно'

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']

views.py is:

class TaskCreate(generic.CreateView):
model = Todo
fields = '__all__'
template_name = 'create.html'
success_url = reverse_lazy('home')

create.html is:

<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'. Как мне решить эту проблему?

Вероятно, вы захотите исключить поле 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)

Note: It is normally better to make use of the settings.AUTH_USER_MODEL [Django-doc] to refer to the user model, than to use the User model [Django-doc] directly. For more information you can see the referencing the User model section of the documentation.


Note: You can limit views to a class-based view to authenticated users with the LoginRequiredMixin mixin [Django-doc].


Примечание: В Django представления, основанные на классах (CBV), часто имеют суффикс …View, чтобы избежать столкновения с именами моделей. Поэтому вы можете переименовать класс представления в TaskCreateView, вместо TaskCreate.

Вернуться на верх