【问题标题】:TypeError: __init__() got an unexpected keyword argument 'instance'TypeError: __init__() 得到了一个意外的关键字参数“实例”
【发布时间】:2016-04-04 11:20:33
【问题描述】:

models.py:

from django.db import models
from django.contrib.auth.models import User as BaseUser

CHOICE_GENDER = ((1, 'Male'), (2, 'Female'))


class Location(models.Model):
    city = models.CharField(max_length=75)
    country = models.CharField(max_length=25)

    def __unicode__(self):
        return ', '.join([self.city, self.state])


class Users(BaseUser):
    user = models.OneToOneField(BaseUser, on_delete=models.CASCADE)
    gender = models.IntegerField(choices=CHOICE_GENDER)
    birth = models.DateField()
    location = models.ForeignKey(Location)

    class Meta:
        ordering = ('user',)

forms.py:

from django.contrib.auth.forms import UserCreationForm
from django import forms
from .models import Users, Location, CHOICE_GENDER


class LocationForm(forms.ModelForm):
    city = forms.CharField(max_length=75)
    country = forms.CharField(max_length=25)

    class Meta:
        model = Location
        fields = ('city', 'country',)


class RegistrationForm(UserCreationForm):
    email = forms.CharField(max_length=75)
    first_name = forms.CharField(max_length=30)
    last_name = forms.CharField(max_length=30)
    gender = forms.ChoiceField(choices=CHOICE_GENDER)
    birth = forms.DateField()
    location = LocationForm()

    class Meta:
        model = Users
        fields = ('username', 'email', 'first_name', 'last_name', 'gender', 'birth', 'location')

    def save(self, commit=True):
        user = super(RegistrationForm, self).save(commit=False)
        user.email = self.cleaned_data['email']
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.gender = self.cleaned_data['gender']
        user.birth = self.cleaned_data['birth']
        user.location = self.cleaned_data['location']
        if commit:
            user.save()
        return user

views.py:

from django.shortcuts import render, redirect
from django.forms import formset_factory
from . import forms


def signup(request):
    if request.method == "POST":
        loc_form = forms.LocationForm(request.POST)
        if loc_form.is_valid():
            loc = loc_form.save()
            RegistrationFormSet = formset_factory(forms.RegistrationForm)
            formset = RegistrationFormSet(request.POST, instance=loc)
            if formset.is_valid():
                formset.save()
                return redirect('./')
            # else:
                # how to make to render the POST data to the template page and fill all fields?
    return render(request, 'signup.html')

我从formset = RegistrationFormSet(request.POST, instance=loc) 的标题中收到错误消息。我正在尝试创建一个有效的视图,该视图将在保存到主表单之前调用另一个表单,这就是我使用 FormSet 的原因,但我无法让它工作。有人可以帮我吗?提前致谢!

【问题讨论】:

    标签: django django-models django-forms django-views


    【解决方案1】:

    RegistrationFormSet 是通过调用 formset_factory 创建的,因此它对实例一无所知。我想你的意思是使用inlineformset_factory,它确实支持它们。

    【讨论】:

    • 它需要指定参数“模型”,那么放在那里呢?我试图将该行更改为RegistrationFormSet = inlineformset_factory(forms.RegistrationForm, model=Users),但它不起作用,它会引发此错误:'ModelFormOptions' object has no attribute 'get_parent_list'。感谢您的帮助!
    猜你喜欢
    • 2012-12-11
    • 2018-09-02
    • 1970-01-01
    • 2017-10-16
    • 2020-10-22
    • 2021-11-17
    • 2016-11-01
    • 2021-10-21
    • 2021-10-15
    相关资源
    最近更新 更多