[英]Django modelformset_factory save nothing
為簡單模型創建了一組表單。 當我嘗試更改表單中的模型對象數據並將這些更改保存在數據庫中時,新數據不會作為結果保存,並且會重定向到具有相同數據的表單頁面,盡管至少有關於應輸出成功或失敗的操作。 終端不會返回任何錯誤,它會在日志中寫入正確的請求發送,測試服務器在正常模式下不會丟失。 有一種觀點認為,其原因是拒絕驗證,但出於何種原因發生這種情況以及隱藏錯誤的地方,尚無法理解。
和
當我點擊“保存”按鈕時,在終端中看到此消息(見下文):
[25/8/2017 18時03分06秒]“GET /類別/?csrfmiddlewaretoken = igSZl3z8pcF9qRGaMts9hG3T9dyaIpVvAxB672R34bmKvGYd6pymjmtwyEgDHGg2&形式-TOTAL_FORMS = 6&形式-INITIAL_FORMS = 5&形狀MIN_NUM_FORMS = 0&形狀MAX_NUM_FORMS = 1000&形式-0-ID = 1&形式-0-名稱= fhdrhddh&形狀配合0級= 0&形式-1-ID = 2&形式-1-名稱= gdegasf&形式-1階= 6&形式-2-ID = 3&形式-2-名稱= dfdgbsbgsdgs&形式-2-順序= 2&形式-3-ID = 4&形式-3- name = dbgsgbasedgbaedvg&form-3-order = 3&form-4-id = 5&form-4-name = dgfsdg3waesdvz&form-4-order = 4&form-5-id =&form-5-name =&form-5-order = 0 HTTP / 1.1“200 7502
models.py(類別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(類別應用)
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)
mixins.py
from django.views.generic.base import ContextMixin
class CategoryListMixin(ContextMixin):
def get_context_data(self, **kwargs):
context = super(CategoryListMixin, self).get_context_data(**kwargs)
context["current_url"] = self.request.path
return context
categories_edit.html(類別應用)
{% 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(類別應用)
{% 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(類別應用)
{% if messages %}
<div id="messages-list">
{% for message in messages %}
<p class="{{ message.tags }}">{{ message }}</p>
{% endfor %}
</div>
{% endif %}
urls.py(類別應用)
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"),
]
settings.py(項目)
"""
Django settings for t****** project.
Generated by 'django-admin startproject' using Django 1.10.6.
For more information on this file, see
https://docs.djangoproject.com/en/1.10/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.10/ref/settings/
"""
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '***************************************************'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'guestbook',
'categories',
'imagepool',
'page',
'main',
'news',
'shop',
'django.contrib.sites',
'django_comments',
'easy_thumbnails',
'taggit',
'precise_bbcode',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 't******.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'tdkennel.wsgi.application'
# Database
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 't******l',
'USER': 'p*******',
'PASSWORD': '********',
'HOST': '',
'PORT': '5432',
}
}
# Password validation
# https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/1.10/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.10/howto/static-files/
STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'),)
MEDIA_ROOT = os.path.join(BASE_DIR, 'upload')
MEDIA_URL = '/media/'
LOGIN_URL = "login"
LOGOUT_URL = "logout"
SITE_ID = 1
THUMBNAIL_BASEDIR = "thumbnails"
THUMBNAIL_BASEDIR = {"goods.Good.image": {"base": {"size": (200, 100)},},}
LOGIN_REDIRECT_URL = "main"
我記得有類似事情發生在我身上。 我最終使用Form
來創建Formset
:
嘗試:
from django.forms import ModelForm
from categories.models import Category
from django.forms.models import modelformset_factory
class CategoryForm(ModelForm):
class Meta:
model = Category
fields = '__all__'
CategoryFormSet = modelformset_factory(Category, form=CategoryForm)
並在CategoriesEdit
使用CategoryFormSet
這只是一種解決方法,但希望這有幫助!
我的疏忽是我的錯。 我在categories_edit.html(在我的項目中)的代碼的注釋和連接部分中編寫了method =“post”,並忘了在未注釋的代碼段中編寫它:
{# <form method="post" action=""> #}
<form method="" action="">
{% include "generic/formset.html" %}
{# {% csrf_token %} #}
{# {{ formset.as_p }} #}
<div class="submit-button"><input type="submit" value="Save"></div>
</form>
但我混淆了用戶,因為在我的問題中寫了一切都是正確的,而不是刪除代碼的連接部分並輸入正確的代碼:
<form method="post" action="">
{% include "generic/formset.html" %}
{# {% csrf_token %} #}
{# {{ formset.as_p }} #}
<div class="submit-button"><input type="submit" value="Save"></div>
</form>
我向回答我問題的用戶道歉! 代碼工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.