【问题标题】:Formset, foreign key and OneToOneFormset、外键和OneToOne
【发布时间】:2014-07-10 19:50:44
【问题描述】:

我想在不使用任何外部应用程序的情况下创建注册表单,但我无法使用表单集保存foregin 和 OneToOne 关系。 这是我的models.py:

class UserProfile(models.Model):
user = models.OneToOneField(User)
avatar = models.ImageField(null=True, blank=True, upload_to='avatar/')
website = models.URLField(null=True, blank=True)
birthday = models.DateField()
country = CountryField()

GENDER_CHOICES = (
    ('M', 'Male'),
    ('F', 'Female'),
)
gender = models.CharField(max_length=1, choices=GENDER_CHOICES)

def __str__(self):
    return "UserProfile(models)"


class UserLanguage(models.Model):
    user = models.ForeignKey(User)
    language = models.CharField(max_length=7, choices=LANGUAGES)
    level = models.CharField(max_length=1)
    # http://stackoverflow.com/questions/3201018/django-language-codes

    def __str__(self):
        return "UserLanguage(models)"

这是我的 forms.py :

class RegisterForm(forms.ModelForm):
class Meta:
    model = User
    fields = ('username', 'password',)
    exclude = ('last_login',)
    widgets = {'password': forms.PasswordInput(), }


UserProfileFormSet = inlineformset_factory(User, UserProfile, can_delete=False)
UserLanguageFormSet = inlineformset_factory(User, UserLanguage, can_delete=False, extra=1)

还有我的views.py:

def registration(request):
if request.method == "POST":
    user = RegisterForm(request.POST)
    user_profile = UserProfileFormSet(request.POST)
    user_language = UserLanguageFormSet(request.POST)

    if user.is_valid() and user_profile.is_valid() and user_language.is_valid():
        u = user.save()

        user_profile.user = u
        user_profile.save()

        user_language.user = u
        user_language.save()

else:
    user = RegisterForm()
    user_profile = UserProfileFormSet()
    user_language = UserLanguageFormSet()

return render(request, 'user/registration.html', locals())

我得到了这个错误:

列 'user_id' 不能为空

我可以做些什么来解决我的问题?你还有什么意见吗? 谢谢。

【问题讨论】:

    标签: python django foreign-keys inline-formset


    【解决方案1】:

    您将表单集命名为 user_profileuser_language 令人困惑。但它们不是配置文件或语言对象,它们是表单集,因此设置它们的用户属性将无效。

    这行得通:

    for profile_form in user_profile.forms:
        up = profile_form.save(commit=False)
        up.user = u
        up.save()
    
    for language_form in user_language.forms:
        ul = language_form.save(commit=False)
        ul.user = u
        ul.save()
    

    但实际上你应该把它们命名为。

    【讨论】:

    • Aaaah 好的,谢谢,这很简单,变量名是对的,我会更改它。 ;) 但是我还有另一个错误:'list' object has no attribute 'user' 在线 up.user = u。你有什么想法吗?
    • 查看我的编辑 - 尽管我知道那些是表单集,而不是表单,但我还是为您提供了保存表单的语法。当您添加属性时,Formsets 会更加复杂,因为您需要为每个表单执行此操作。
    • 非常感谢,效果很好。 ;) 祝你有美好的一天。
    猜你喜欢
    • 1970-01-01
    • 2016-05-26
    • 2021-08-16
    • 2013-10-12
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    相关资源
    最近更新 更多