Подтвердить что ты не робот

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, но не смог найти решение моей проблемы, поэтому любая помощь будет оценена.

4b9b3361

Ответ 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 назад назад на один отступ.