如何修复Meta.fields不能为字符串。你是想输入: ('name')吗?

8 投票
1 回答
12551 浏览
提问于 2025-04-17 20:37

目前我有一个脚本,可以让用户通过表单添加新的酒店。以下是这个脚本。

我遇到了一个错误,提示信息是:AddHotelForm.Meta.fields 不能是一个字符串。你是不是想写成:('name',)?

请求方法:GET

请求网址:8000/hotel/new

Django版本:1.6.2

异常类型:TypeError

异常内容:

AddHotelForm.Meta.fields 不能是一个字符串。你是不是想写成:('name',)?

异常位置:/usr/local/lib/python2.7/dist-packages/django/forms/models.py 的 new 函数,261行

我似乎搞不懂这个问题。我检查了好几次,但还是找不到解决办法。

views.py

from django.shortcuts import render_to_response
from forms import AddHotelForm
from django.http import HttpResponseRedirect
from django.core.context_processors import csrf
from hotel.models import hotel

def create(request):

    if request.POST:

         form = AddHotelForm(request.POST)

         if form.is_valid():

            form.save()

            return HttpResponseRedirect('/articles/all/')

    else:

         form = AddHotelForm()

    args = {}
    args.update(csrf(request))

    args['form'] = form

    return render_to_response('add_hotel.html', args)

models.py

from django.db import models
from user.models import user


class hotel(models.Model):

    publisher = models.ForeignKey(user)
    name = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100)
    creation_date = models.DateField(auto_now_add=True)

    def __unicode__(self):
        return self.name

forms.py

from django import forms
from models import hotel


class AddHotelForm(forms.ModelForm):

    class Meta:
        models = hotel
        fields = ('name')

add_hotel.html

{% block content%}
<html>
<head>
    <title></title>
    <style type="text/css">
        li {
            padding:5px;
            margin-bottom: 5px;
            list-style: none;

        }

        .errorlist {
            background-color: red;
            color:white;
            padding: 1px;
            width:150px;
            margin-bottom: 5px;
            font-size: 12px;
            font-family: arial, serif;

        }

        label {
            display: block;
            font-size: 12px;
            font-family: arial, serif;
        }
    </style>
</head>
<body>
    <form action="/hotel/new/" method="post">
        {% csrf_token %}
        <uL style="display:block;">
            {{form.as_ul}}
        </ul>
        <input type="submit" name="submit" value="Create Hotel">
    </form>
</body>
</html>
 {% endblock%}

1 个回答

24

所以这个问题看起来正是错误信息中所说的那样。

你的问题在于这个:

("name")

和这个是不一样的:

("name",)

试试看:

>>> type(("name"))
<type 'str'>
>>> type(("name",))
<type 'tuple'>

所以要解决这个问题,你需要修改你的表单定义:

class AddHotelForm(forms.ModelForm):

    class Meta:
        models = hotel # This should be "model" not "models".
        fields = ('name',)

撰写回答