Создал набор форм для простой модели. При попытке изменить в форме данные объекта модели и сохранить эти изменения в базе данных, то новые данные в результате не сохраняются и происходит редирект на страницу формы с прежними данными, хотя должны выводится хотя бы сообщения об успешности или провале операции. Терминал не возвращает никаких ошибок, в логах написано, что был передан корректный запрос, тестсервер работает без падений в нормальном режиме. Есть мнение, что причина тому отказ в валидации, но по какой причине это происходит и где именно затаилась ошибка понять пока не получается. urls.py (categories app) Код | from django.conf.urls import url from django.contrib.auth.decorators import login_required from categories.views import CategoriesEdit
urlpatterns = [ url(r'^$', login_required(CategoriesEdit.as_view()), name = "categories_edit"), ]
|
models.py (categories app) Код | from django.db import models
# Create your models here.
class Category(models.Model): name = models.CharField(max_length = 30, db_index = True, unique = True, verbose_name = "Title") order = models.PositiveSmallIntegerField(default = 0, db_index = True, verbose_name = "Serial number") def __str__(self): return self.name class Meta: ordering = ["order", "name"] verbose_name = "category" verbose_name_plural = "categories"
|
views.py (categories app) Код | from django.views.generic.base import TemplateView from django.forms.models import modelformset_factory from django.shortcuts import redirect from django.contrib import messages from categories.models import Category from generic.mixins import CategoryListMixin
CategoriesFormset = modelformset_factory(Category, can_delete=True, fields = '__all__', extra=1, max_num=None)
class CategoriesEdit(TemplateView, CategoryListMixin): template_name = "categories_edit.html" formset = None def get(self, request, *args, **kwargs): self.formset = CategoriesFormset() return super(CategoriesEdit, self).get(request, *args, **kwargs) def get_context_data(self, **kwargs): context = super(CategoriesEdit, self).get_context_data(**kwargs) context["formset"] = self.formset return context def post(self, request, *args, **kwargs): self.formset = CategoriesFormset(request.POST) if self.formset.is_valid(): self.formset.save() messages.api.add_message(request, messages.SUCCESS, "List of categories successfully changed") return redirect("categories_edit") else: messages.api.add_message(request, messages.SUCCESS, "Something is wrong!!!") return super(CategoriesEdit, self).get(request, *args, **kwargs)
|
categories_edit.html (categories app) Код | {% extends "categories_base.html" %} {% block title %} Categories {% endblock %} {% block main %} {% include "generic/messages.html" %} {{ formset.errors }} <h2>Categories</h2> <form action="" method="post"> {% include "generic/formset.html" %} <div class="submit-button"><input type="submit" value="Save"></div> </form> {% endblock %}
|
formset.html (categories app) Код | {% csrf_token %} {{ formset.management_form }} <table class="form"> <tr> <th></th> {% with form=formset|first %} {% for field in form.visible_fields %} <th> {{ field.label }} {% if field.help_text %} <br>{{ field.help_text }} {% endif %} </th> {% endfor %} {% endwith %} </tr> {% for form in formset %} <tr> <td> {% for field in form.hidden_fields %} {{ field }} {% endfor %} </td> {% for field in form.visible_fields %} <td> {% if field.errors.count > 0 %} <div class="error-list"> {{ field.errors }} </div> {% endif %} <div class="control">{{ field }}</div> </td> {% endfor %} </tr> {% endfor %} </table>
|
messages.html (categories app) Код | {% if messages %} <div id="messages-list"> {% for message in messages %} <p class="{{ message.tags }}">{{ message }}</p> {% endfor %} </div> {% endif %}
|
Это сообщение отредактировал(а) redwatcher - 25.8.2017, 15:07
|