Python 德扬戈:我能';t在表单集中添加多行时不会出现错误

Python 德扬戈:我能';t在表单集中添加多行时不会出现错误,python,django,formset,Python,Django,Formset,我在处理Django项目时发现了一个错误。为了总结这个问题,每次我尝试向一个表单集中添加多行时,都会得到一个multivaluedictkeyrorm错误 每次我尝试提交表单时,即使我没有更改表单集,错误仍然存在 这是我的代码:View.py def profile(request): # Get the user's profile try: profile = Profile.objects.get(user = request.user.id) ex

我在处理Django项目时发现了一个错误。为了总结这个问题,每次我尝试向一个表单集中添加多行时,都会得到一个
multivaluedictkeyrorm
错误

每次我尝试提交表单时,即使我没有更改表单集,错误仍然存在

这是我的代码:View.py

def profile(request):
    # Get the user's profile
    try:
        profile = Profile.objects.get(user = request.user.id)
    except:
        profile = Profile()
        profile.user = request.user

    # inline formset for profile's pony
    PonyFormset = inlineformset_factory(Profile, Pony, fields=('pony','message',), extra = 2)

    # inline formset for profile's url
    UrlFormset = inlineformset_factory(Profile, Url, fields=('url',), extra = 2)

    if request.method == 'POST':

        form = ProfileForm(request.POST, request.FILES, instance = profile)
        ponies = PonyFormset(request.POST, instance = profile, prefix = "pony")
        urls = UrlFormset(request.POST, instance = profile, prefix = "url")

        if form.is_valid():
            form.save()
            form = ProfileForm(instance = profile)

        if ponies.is_valid():
            ponies.save()
            ponies = PonyFormset(instance = profile, prefix = "pony")

        if urls.is_valid():
            urls.save()
            urls = UrlFormset(instance = profile, prefix = "url")

    else:
        form = ProfileForm(instance = profile)
        ponies = PonyFormset(instance = profile, prefix = "pony")
        urls = UrlFormset(instance = profile, prefix = "url")

    return render(request, 'profile.html', {
        'profile': profile,
        'form':    form,
        'ponies':  ponies,
        'urls':    urls,
    })
Model.py

class Pony(models.Model):
    ''' List of ponies with little quotes to display in the user's description '''

    profile = models.ForeignKey(Profile)
    pony    = models.CharField(max_length = 32)
    message = models.CharField(max_length = 64)

    def __str__(self):
        try:
            return self.message % self.pony
        except TypeError:
            return self.message

    class Meta:
        verbose_name_plural = "ponies"

class Url(models.Model):
    ''' List of urls in the user's description '''

    profile = models.ForeignKey(Profile)
    url     = models.URLField()
    icon    = models.CharField(max_length = 16)

    def __str__(self):
        return self.url
模板

<h3>{% trans 'Url :' %}</h3>
                <!-- url -->
                {{ urls.management_form }}
                {% for urlform in urls %}
                    {% if ponies.can_delete %}
                        {% bootstrap_field urlform.url show_label=false field_class='col-xs-11' form_group_class='' %}
                        {% bootstrap_field urlform.DELETE %}
                    {% else %}
                        {% bootstrap_field urlform.message show_label=false field_class='col-xs-12' %}
                    {% endif %}
                {% endfor %}
{%trans'Url:'%1}
{{url.management_form}
{%用于URL%中的urlform}
{%if ponies.can_delete%}
{%bootstrap_field urlform.url show_label=false field_class='col-xs-11'form_group_class=''%}
{%bootstrap_字段urlform.DELETE%}
{%else%}
{%bootstrap_field urlform.message show_label=false field_class='col-xs-12'%}
{%endif%}
{%endfor%}
(我只放置Url表单集,因为小马表单集是相同的)

和错误(对于多个url)

环境:

Request Method: POST
Request URL: http://127.0.0.1:8000/fr/profil

Django Version: 1.8.1
Python Version: 3.4.3
Installed Applications:
('core',
 'users',
 'bbbff',
 'agenda',
 'sugarcub',
 'stdimage',
 'bootstrap3',
 'django_admin_bootstrapped',
 'django.contrib.admindocs',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'multiform',
 'registration',
 'endless_pagination',
 'absolute')

Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.locale.LocaleMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'django.contrib.admindocs.middleware.XViewMiddleware')

Traceback:

File "/usr/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/lib/python3.4/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
  22.                 return view_func(request, *args, **kwargs)
File "/home/baptiste/sugarcub/users/views.py" in profile
  65.         if urls.is_valid():
File "/usr/lib/python3.4/site-packages/django/forms/formsets.py" in is_valid
  304.         self.errors
File "/usr/lib/python3.4/site-packages/django/forms/formsets.py" in errors
  278.             self.full_clean()
File "/usr/lib/python3.4/site-packages/django/forms/formsets.py" in full_clean
  326.             form = self.forms[i]
File "/usr/lib/python3.4/site-packages/django/utils/functional.py" in __get__
  60.         res = instance.__dict__[self.name] = self.func(instance)
File "/usr/lib/python3.4/site-packages/django/forms/formsets.py" in forms
  142.         forms = [self._construct_form(i) for i in range(self.total_form_count())]
File "/usr/lib/python3.4/site-packages/django/forms/formsets.py" in <listcomp>
  142.         forms = [self._construct_form(i) for i in range(self.total_form_count())]
File "/usr/lib/python3.4/site-packages/django/forms/models.py" in _construct_form
  872.         form = super(BaseInlineFormSet, self)._construct_form(i, **kwargs)
File "/usr/lib/python3.4/site-packages/django/forms/models.py" in _construct_form
  587.             pk = self.data[pk_key]
File "/usr/lib/python3.4/site-packages/django/utils/datastructures.py" in __getitem__
  322.             raise MultiValueDictKeyError(repr(key))

Exception Type: MultiValueDictKeyError at /fr/profil
Exception Value: "'url-0-id'"
请求方法:POST
请求URL:http://127.0.0.1:8000/fr/profil
Django版本:1.8.1
Python版本:3.4.3
已安装的应用程序:
(“核心”,
“用户”,
“bbbff”,
"议程",,
“糖崽”,
“stdimage”,
“bootstrap3”,
“django_admin_引导”,
“django.contrib.admindocs”,
“django.contrib.admin”,
“django.contrib.auth”,
“django.contrib.contenttypes”,
“django.contrib.sessions”,
“django.contrib.messages”,
“django.contrib.staticfiles”,
“多样性”,
“注册”,
“无休止的分页”,
‘绝对’)
已安装的中间件:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
“django.middleware.csrf.CsrfViewMiddleware”,
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.xFrameOptions中间件',
'django.contrib.admindocs.middleware.XViewMiddleware')
回溯:
get_响应中的文件“/usr/lib/python3.4/site packages/django/core/handlers/base.py”
132响应=包装的回调(请求,*回调参数,**回调参数)
视图中的文件“/usr/lib/python3.4/site packages/django/contrib/auth/decorators.py”
22返回视图功能(请求,*args,**kwargs)
配置文件中的文件“/home/baptiste/sugarcub/users/views.py”
65如果URL.is_有效():
中的文件“/usr/lib/python3.4/site packages/django/forms/formsets.py”有效
304自我错误
文件“/usr/lib/python3.4/site packages/django/forms/formsets.py”出现错误
278self.full_clean()
文件“/usr/lib/python3.4/site packages/django/forms/formsets.py”的全文
326形式=自我。形式[i]
获取中的文件“/usr/lib/python3.4/site packages/django/utils/functional.py”__
60res=instance.\uuuu dict\uuuu[self.name]=self.func(实例)
forms中的文件“/usr/lib/python3.4/site packages/django/forms/formsets.py”
142forms=[self.\u construct\u form(i)表示范围内的i(self.total\u form\u count())]
文件“/usr/lib/python3.4/site packages/django/forms/formsets.py”
142forms=[self.\u construct\u form(i)表示范围内的i(self.total\u form\u count())]
文件“/usr/lib/python3.4/site packages/django/forms/models.py”,格式为
872形式=超级(BaseInlineFormSet,self)。\u构造\u形式(i,**kwargs)
文件“/usr/lib/python3.4/site packages/django/forms/models.py”,格式为
587pk=自身数据[pk\U键]
文件“/usr/lib/python3.4/site packages/django/utils/datastructures.py”位于__
322升起多值钥匙错误(repr(钥匙))
异常类型:在/fr/profil处出现多值错误
异常值:“'url-0-id'”

我想我把这个问题的所有东西都放在这里了,如果你需要更多,我可以加上。提前谢谢你帮助我

您需要在表单集中包含每个表单的
id
字段(它是一个隐藏字段,因此不会向用户显示)

通常,您可以在模板中执行此操作:

{% for form in formset %}
    {{ form.id }}
    ...
就你而言:

{% for urlform in urls %}
    {{ urlform.id }}

您可能需要为其他表单集执行类似的操作。

好的,可以了。谢谢您的帮助,我不知道这个隐藏字段。根据我的猜测,它的目标是分离表单集的每个表单。是吗?我不知道你说的“分开每个表格”是什么意思。据说包含主键字段是一项要求。我错过了文档的这一部分。我会更加小心的,再次谢谢你