在Django中扩展用户配置文件。管理员创建用户

5

晚上好,

我正在使用Django创建一个网站,并扩展了用户资料。然而,我遇到了一个小问题,下面是我的情况:

  1. 我扩展了用户资料以添加自定义字段。
  2. 我将模型添加到了用户管理模型中,因此当我添加用户时,可以直接填写字段来创建资料。
  3. 现在,如果我在用户添加页面上这些新的自定义用户字段中什么也不填写,Django管理界面不会提示我这些字段为空(它们应该不为空)。
  4. 我希望在用户添加管理页面上抛出一个错误,以便管理员在添加新用户时必须填写资料。
  5. 所有用户都将在管理面板中添加。

是否可能实现这一点?非常感谢!

在admin.py文件中:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as DjangoUserAdmin
from django.contrib.auth.models import User
from accounts.models import UserProfile


class UserProfileInline(admin.TabularInline):
    model = UserProfile


class UserAdmin(DjangoUserAdmin):
    inlines = [ UserProfileInline,]


admin.site.unregister(User)
admin.site.register(User, UserAdmin)

在 model.py 文件中:
class UserProfile(models.Model):
    user = models.OneToOneField(User)
    employee_number = models.PositiveIntegerField(unique=True)

    def __unicode__(self):
        return 'Number'
1个回答

5

默认情况下,允许空的内联元素,因此不会对空表单进行进一步检查。您需要手动覆盖它:

class UserProfileForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(UserProfileForm, self).__init__(*args, **kwargs)
        if self.instance.pk is None:
            self.empty_permitted = False # Here

    class Meta:
        model = UserProfile


class UserProfileInline(admin.TabularInline):         
    model = UserProfile                               
    form = UserProfileForm  

很好,它起作用了!你介意再解释一下代码的作用吗?特别是“类元:”部分!谢谢伙计。 - abisson
另外,如果我只想让一个字段的empty_permitted = false,而其他字段为true,语法应该是什么? - abisson
@abisson empty_permitted是一个未记录在案的参数,可以被BaseForm接受:当提交的表单从其初始数据没有被更改,且它的empty_permittedTrue时,表单的full_clean()不会执行任何进一步的验证。你可以在django/forms/forms.pydjango/forms/formsets.py中检查empty_permitted。如果您想要让其中一个字段不为空,则可以尝试为表单设置empty_permitted=True,同时为其他字段设置blank=True - okm
我明白了,有道理。我以为empty_permitted会应用于所有字段,即使是设置了blank=true的字段,但是根据你的说法并不是这样。那么Class Meta是什么? - abisson
1
@abisson Meta是由ModelForm使用的内部类,就像Model中的那些一样。您可以参考文档 - okm
@abisson 你可能想要检查一下这个相同的答案以及另一种解决方法:http://stackoverflow.com/questions/10226924/force-the-user-to-add-an-instance-of-some-inlinemodeladmin-when-adding-a-model/10228232#10228232。很好。我们昨天都遇到了同样的问题 ;) - Oscar Mederos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接