Question RemovedInDjango18Warning: la création d'un ModelForm sans l'attribut "fields" ou l'attribut "exclude" est obsolète


Je fais un projet Django et quand j'ai essayé d'accéder à 127.0.0.1:8000/articles/create, j'ai eu l'erreur suivante dans mon terminal 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):

De plus, j'ai aussi eu l'erreur suivante lors de la visite de mon site localhost:

ValueError at /articles/create/

The view article.views.create didn't return an HttpResponse object. It returned None instead.

Voici mon fichier forms.py:

from django import forms
from models import Article

class ArticleForm(forms.ModelForm):

    class Meta:
        model = Article 

Et voici mon fichier 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)

Je ne sais pas comment résoudre ce problème. J'ai regardé la documentation de Django mais je n'ai pas trouvé de solution à mon problème, alors toute aide serait appréciée.


23
2018-02-03 18:36


origine


Réponses:


Pour votre formulaire, il s'agit d'un avertissement, pas d'une erreur, vous indiquant que dans django 1.8, vous devrez changer votre formulaire pour

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

Ou ajouter un exclude pour lister les champs à exclure à la place

Ce qui n'était pas nécessaire jusqu'à 1.8

https://docs.djangoproject.com/en/1.8/topics/forms/modelforms/#selecting-the-fields-to-use

En ce qui concerne l'erreur avec vos vues, votre retour est à l'intérieur d'un if déclaration: if request.POST: ainsi, quand il reçoit une demande de réception, rien n'est renvoyé.

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)

Juste déduire le else bloquer pour qu'il s'applique à la bonne if déclaration.


79
2018-02-03 18:40



Vous avez juste besoin...

from django import forms
from models import Article

class ArticleForm(forms.ModelForm):

    class Meta:
        model = Article
        exclude = ()

... pour réparer votre formulaire. Vous devrez poster votre code de vue pour voir ce que cela donne.


5
2018-02-03 18:40



si tu utilises fields = __all__ Comme Ngenator l’a suggéré, et s’il s’agit d’un projet devant être exécuté sous différentes versions de Django, les conditions suivantes seront nécessaires:

if django.VERSION >= (1, 6):
    fields = '__all__'  # eliminate RemovedInDjango18Warning

sinon vous obtenez l'erreur django.core.exceptions.FieldError: Unknown field(s) (a, l, _) specified for CrispyTestModel, comme vu ici: https://travis-ci.org/maraujop/django-crispy-forms/jobs/56996180


5
2018-04-03 21:16



À votre avis, vous ne retournez rien si la demande n'est pas un POST. Vous devriez tout déplacer du else déclaration en arrière une indentation.


2
2018-02-03 18:55