Задать вопрос
@Allexs

Почему CreateView не сохраняет форму в БД?

Доброго времени суток. Прошу заранее "понять и простить", если вопрос покажется глупым для опытных программистов. Впервые за долгое время прибегаю к просьбе сообщества. Перегуглил и перечитал множество информации. В том числе и: Как написать CreateView для модели с ForeignKey? - описанные тут решения, тоже почему то не помогли.

У меня есть следующие модели:
models.py
class ToDoList(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

class ToDoItem(models.Model):
    list = models.ForeignKey(ToDoList, on_delete=models.CASCADE)
    text = models.CharField(max_length=200)

    def __str__(self):
        return self.text


Есть форма:
forms.py
class List(ModelForm):

    class Meta:
        model = ToDoList
        fields = ['user', 'name']

Желательно, чтобы поле user, автоматически заполнялось данными авторизированного пользователя. Знаю, что его, в таком случае, не надо указывать в переменной fields, но и в приведенном мной примере, данные все равно не сохраняются.

Так выглядит файл urls.py
app_name = 'main'

urlpatterns = [
    re_path('^$', views.AllListView.as_view(), name='list'),
    re_path('^(?P<pk>\d+)/$', views.ListDetailView.as_view(), name='detail'),
    re_path('^new_list/$', views.ListCreateView.as_view(), name='new'),
]


Вот собственно views.py
class AllListView(ListView):
    context_object_name = 'todolists'
    model = ToDoList
    template_name = 'todo/list.html'

    def get_queryset(self):
        user = self.request.user
        result = ToDoList.objects.filter(user=user)
        return result

class ListDetailView(DetailView):
    context_object_name = 'todolist_detail'
    model = ToDoList
    template_name = 'todo/list_items.html'

class ListCreateView(CreateView):
    form_class = List
    template_name = 'todo/list_new.html'
    success_url = 'list'


Это простейшее, надоевшее всем, приложение аля ToDo, как вы уже могли понять. До этого я его реализовал через функциональные представления без проблем, теперь решил сделать с помощью CBV.
Логика следующая: пользователь авторизовался, перешел на страницу списков, создал списки задач(у себя для отображения я их создал через админку), далее в список добавил задачи и т.д.

С ListView и DetailView проблем нет.

На основной странице отображается список листов. Там кнопка "New list" по ней я перехожу на CreateView. Ввожу данные для полей и не происходит ровным счетом ничего. Джанго ни на что не жалуется, об ошибках не сообщает. Не редиректа, не сохраненной в БД записи.

Вот html код на всякий случай, html код detailview соответственно не размещаю.
list.html
{% extends 'second_base.html' %}

{% block content %}

<div class='container'>
    <div class='col-6'>
        <h1>Ваш список листов:</h1>
        <div class='row mt-4'>
            <ul class="list-group">
            {% for todolist in todolists %}
                <li class="list-group-item"><a href="{{ todolist.id }}">{{ todolist.name }}</a></li>
            {% endfor %}
            </ul>
        </div>
        <a href="{% url 'main:new' %}">New list</a>
    </div>
</div>

{% endblock %}


list_new.html
{% extends 'second_base.html' %}

{% block content %}
<form class="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <input type='submit' class='btn btn-primary' value='Submit'>
</form>
{% endblock %}


Все подробно расписал, чтоб уберечь себя и вас от уточнений. Очень прошу помочь. Заранее спасибо.
  • Вопрос задан
  • 334 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
Потому что ты не вызываешь метод пост при клике на кнопку!
Замени строчку:
<form class="POST">
на 
<form method="post">

Удачи!
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы