RemovedInDjango18 Предупреждение: создание ModelForm без атрибута "fields" или атрибута "exclude" устарело
Я делаю проект Django, и когда я пытался получить доступ к 127.0.0.1:8000/articles/create, я получил следующую ошибку в моем терминале Ubuntu:
/home/(my name)/django_test/article/forms.py:4: RemovedInDjango18Warning: Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is deprecated - form ArticleForm needs updating
class ArticleForm(forms.ModelForm):
Кроме того, я также получил следующую ошибку при посещении моего фактического сайта localhost:
ValueError at /articles/create/
The view article.views.create didn't return an HttpResponse object. It returned None instead.
Вот мой файл forms.py:
from django import forms
from models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
И вот мой файл views.py:
from django.shortcuts import render_to_response
from article.models import Article
from django.http import HttpResponse
from forms import ArticleForm
from django.http import HttpResponseRedirect
from django.core.context_processors import csrf
#import pdb; pdb.set_trace()
# Create your views here.
def articles(request):
language = 'en-us'
session_language = 'en-us'
if 'lang' in request.COOKIES:
language = request.COOKIES['lang']
if 'lang' in request.session:
session_language = request.session['lang']
return render_to_response('articles.html',
{'articles':
Article.objects.all(), 'language' : language,
'session_language' : session_language})
def article(request, article_id=1):
return render_to_response('article.html', {'article':
Article.objects.get(id=article_id) })
def language(request, language='en-us'):
response = HttpResponse("setting language to %s" %
language)
response.set_cookie('lang', language)
response.session['lang'] = language
return response
def create(request):
if request.POST:
form = ArticleForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect('/articles/all')
else:
form = ArticleForm()
args = {}
args.update(csrf(request))
args['form'] = form
return render_to_response('create_article.html', args)
Я не уверен, как исправить эту проблему. Я просмотрел документацию Django, но не смог найти решение моей проблемы, поэтому любая помощь будет оценена.
Ответы
Ответ 1
Для вашей формы это предупреждение, а не ошибка, сообщая вам, что в django 1.8 вам нужно будет изменить свою форму на
from django import forms
from models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = '__all__' # Or a list of the fields that you want to include in your form
Или добавьте exclude
в список полей для исключения вместо
Что не требовалось до 1,8
https://docs.djangoproject.com/en/1.8/topics/forms/modelforms/#selecting-the-fields-to-use
Что касается ошибки с вашими представлениями, ваше возвращение находится внутри оператора if
: if request.POST:
, поэтому, когда он получает запрос на получение, ничего не возвращается.
def create(request):
if request.POST:
form = ArticleForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect('/articles/all')
else:
form = ArticleForm()
args = {}
args.update(csrf(request))
args['form'] = form
return render_to_response('create_article.html', args)
Просто выделите блок else
, чтобы применить его к правильному оператору if
.
Ответ 2
Вам просто нужно...
from django import forms
from models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
exclude = ()
... исправить вашу форму. Вам нужно будет опубликовать свой код просмотра, чтобы узнать, что с ним.
Ответ 3
если вы используете fields = __all__
, как предлагал Ngenator, и если это проект, который может запускаться в разных версиях Django, потребуется следующее условие:
if django.VERSION >= (1, 6):
fields = '__all__' # eliminate RemovedInDjango18Warning
в противном случае вы получите ошибку django.core.exceptions.FieldError: Unknown field(s) (a, l, _) specified for CrispyTestModel
, как показано здесь: https://travis-ci.org/maraujop/django-crispy-forms/jobs/56996180
Ответ 4
По вашему мнению, вы ничего не возвращаете, если запрос не является POST. Вы должны переместить все из инструкции else
назад назад на один отступ.