RemovedInDjango18Warning: Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is deprecated

匿名 (未验证) 提交于 2019-12-03 01:18:02

问题:

I am doing a Django project and when I tried to access 127.0.0.1:8000/articles/create, I got the following error in my Ubuntu terminal:

/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):

In addition, I also got the following error when visiting my actual localhost site:

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

Here is my forms.py file:

from django import forms from models import Article  class ArticleForm(forms.ModelForm):      class Meta:         model = Article 

And here is my views.py file:

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)

I'm not sure how to fix this problem. I looked at the Django documentation but I couldn't find a solution to my problem so any help would be appreciated.

回答1:

For your form, it's a warning, not an error, telling you that in django 1.8, you will need to change your form to

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

Or add an exclude to list fields to exclude instead

Which wasn't required up till 1.8

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

As for the error with your views, your return is inside of an if statement: if request.POST: so when it receives a get request, nothing is returned.

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)

Just dedent the else block so that it's applying to the correct if statement.



回答2:

You just need...

from django import forms from models import Article  class ArticleForm(forms.ModelForm):      class Meta:         model = Article         exclude = ()

...to fix your form. You'll need to post your view code to see what's up with that.



回答3:

if you use fields = __all__ as Ngenator suggested, and if it's a project that might have to run under various versions of Django, the following conditional will be needed:

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

otherwise you get the error django.core.exceptions.FieldError: Unknown field(s) (a, l, _) specified for CrispyTestModel, as seen here: https://travis-ci.org/maraujop/django-crispy-forms/jobs/56996180



回答4:

In your view, you don't return anything if the request is not a POST. You should move everything from the else statement onwards back one indent.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!