Django 1.6 向用户模型添加自定义字段

-1 投票
3 回答
979 浏览
提问于 2025-04-18 04:04

我有以下内容

profile/models.py

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    university = models.CharField(max_length=200, choices=UNIVERSITY, null=True)

profile/views.py

class UserForm(ModelForm):
    class Meta:
        model = UserProfile
        fields = ('username', 'first_name', 'last_name', 'email', 'university')

我已经运行了 south,数据库也更新了,但我还是遇到了这个错误

django.core.exceptions.FieldError: Unknown field(s) (first_name, username, email, last_name) specified for UserProfile

我猜这可能和表之间的关联方式有关。在我的 UserProfile 表里,有 id、user_id 和 university 这几列,并且里面有合适的数据。

3 个回答

0

一个 ModelForm 只能为一个模型生成字段(就是在 Meta 类中指定的那个模型)

在 Django 中,如果你想要一个表单包含相关模型的字段,可以使用内联表单集(Inline formset):
https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#inline-formsets

例如

# forms.py
UserProfileFormSet = inlineformset_factory(User, UserProfile, max_num=1)

# views.py
from django.contrib.auth.models import User
from django.shortcuts import get_object_or_404, render_to_response
from .forms import UserProfileFormSet

def myview(request, user_id):
    user = get_object_or_404(User, pk=user_id)
    formset = UserProfileFormSet(request.POST or None, instance=user)
    if formset.is_valid():
        formset.save()
        # ...redirect here
    return render_to_response("my_template.html", {
        "formset": formset,
    })
0

一个 ModelForm 只能为一个模型生成表单字段,在这个例子中就是 UserProfile。在你的元类中,fields 属性指定了要显示哪些表单字段。在这个例子里,first_nameusernameemaillast_name 这些字段没有被定义。你需要手动在表单中定义它们,并且修改保存的方法,以便保存 User 对象:

class UserForm(forms.ModelForm):
    username = forms.CharField(max_length=100)
    email = forms.EmailField()
    ...

    class Meta:
        model = UserProfile
        fields = ('username', 'first_name', 'last_name', 'email', 'university')

    def save(self, commit=True):
        # save user and profile
0

最后我通过替换成自定义用户模型解决了这个问题。这样我就可以在一个叫做profiles_users的表里设置所有用户信息,还可以添加额外的字段。

虽然需要进行一些自定义设置,但我觉得这种方法比扩展用户基础类要顺畅得多。

撰写回答