【问题标题】:Extending new user creation form, Django扩展新用户创建表单,Django
【发布时间】:2011-08-11 14:50:09
【问题描述】:

我正在尝试将位置字段添加到用户配置文件并将其与用户相关联。我目前有这样的事情:

这是我的models.py:

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save

class UserProfile(models.Model):
        user = models.OneToOneField(User)
        location = models.CharField(('location'),max_length=30, blank=False)

def create_user_profile(sender, instance, created, **kwargs):
    if created:
        profile = UserProfile.objects.create(user=instance)
        profile.save()

post_save.connect(create_user_profile, sender=User)

这是我的 admin.py:

from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from django import forms
from UserProfile.models import UserProfile
from django.contrib.admin.views.main import *

class MyUserCreationForm(UserCreationForm):

    username = forms.RegexField(label=("Username"), max_length=30, regex=r'^[\w.@+-]+$', help_text = ("Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only."),error_messages = {'invalid': ("This value may contain only letters, numbers and @/./+/-/_ characters.")})
    password1 = forms.CharField(label=("Password"), widget=forms.PasswordInput)
    password2 = forms.CharField(label=("Password confirmation"), widget=forms.PasswordInput, help_text = ("Enter the same password as above, for verification."))
    email = forms.EmailField(label=("Email address"))

    class Meta:
        model = User
        fields = ("username",)

    def clean_username(self):
        username = self.cleaned_data["username"]
        try:
            User.objects.get(username=username)
        except User.DoesNotExist:
            return username
        raise forms.ValidationError(("A user with that username already exists."))

    def clean_email(self):
    email = self.cleaned_data["email"]
    if email == "":
            raise forms.ValidationError((""))
    return email

    def clean_password2(self):
        password1 = self.cleaned_data.get("password1", "")
        password2 = self.cleaned_data["password2"]
        if password1 != password2:
            raise forms.ValidationError(("The two password fields didn't match."))
        return password2

    def save(self, commit=True):
        user = super(UserCreationForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user

class MyUserChangeForm(UserChangeForm):
    username = forms.RegexField(label=("Username"), max_length=30, regex=r'^[\w.@+-]+$',
        help_text = ("Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only."),
        error_messages = {'invalid': ("This value may contain only letters, numbers and @/./+/-/_ characters.")})
    location = forms.CharField(label=("Location"),max_length=30)

    class Meta:
        model = User

    def __init__(self, *args, **kwargs):
        super(UserChangeForm, self).__init__(*args, **kwargs)
        f = self.fields.get('user_permissions', None)
        if f is not None:
            f.queryset = f.queryset.select_related('content_type')


class CustomUserAdmin(UserAdmin):
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('username', 'email', 'password1', 'password2')}
        ),
    )
    fieldsets = (
        (None, {'fields': ('username', 'password')}),
        (('Personal info'), {'fields': ('first_name', 'last_name', 'email', 'location')}),
        (('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser', 'user_permissions')}),
        (('Important dates'), {'fields': ('last_login', 'date_joined')}),
        (('Groups'), {'fields': ('groups',)}),
    )
    add_form = MyUserCreationForm
    form = MyUserChangeForm

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

我不完全理解 Django/python 代码,并且我知道此代码中缺少某些内容,因为当我添加新用户时,它不会将 Location 字段保存在数据库中。它保存了用户ID。我想我错过了类似的东西:

request.user.get_profile().location = self.cleaned_data["location"]

但我不知道该放在哪里。

【问题讨论】:

  • 您的代码似乎有错误的缩进。如果您更正缩进,我们调试您的代码会容易得多。我注意到的一件事是,如果您需要电子邮件,只需将 required=True 参数传递给它,而不是手动验证它。

标签: python django model


【解决方案1】:

您可以为此使用模型继承,它会为您做类似的事情......

Model Inheritance and proxy models...

【讨论】:

  • 我会感谢我的代码的实际帮助。我已经阅读了许多不同的页面,并且在所有这些页面中,人们都在做不同的事情。阅读更多内容不会帮助我更好地理解代码。
  • 在 django.contrib.auth 的情况下,模型继承也不好,用户模型的扩展应该存在于 UserProfile 模型中。
【解决方案2】:

您是否尝试过对配置文件使用简单的内联?是的,它会显示在底部,否则它会起作用。

from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin
from website.users.models import UserProfile

admin.site.unregister(User)

class UserProfileInline(admin.StackedInline):
    model = UserProfile
    max_num = 1

class UserProfileAdmin(UserAdmin):
    inlines = [UserProfileInline]
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('username', 'email', 'password1', 'password2')}
        ),
    )
    fieldsets = (
        (None, {'fields': ('username', 'password')}),
        (('Personal info'), {'fields': ('first_name', 'last_name', 'email', 'location')}),
        (('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser', 'user_permissions')}),
        (('Important dates'), {'fields': ('last_login', 'date_joined')}),
        (('Groups'), {'fields': ('groups',)}),
    )

admin.site.register(User, UserProfileAdmin)

【讨论】:

  • 我确实尝试过,但我得到了这个错误,我不知道它是什么意思或哪里出错了。 column user_id is not unique
  • 这是因为您没有将 UserProfile 类中的“用户”字段声明为 -to-one。 *编辑:哦,亲爱的,您已将其声明为 OneToOneField...
  • 您是否要插入多个地址?一个用户最多只能有一个配置文件,因此将“max_num”选项添加到内联中,如已编辑。
  • 抱歉回复延迟 :) 我已经完成了那个项目,但感谢您的帮助!我对内置 django 函数的体验真的很糟糕,希望我不必再次使用它! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 2017-02-01
  • 1970-01-01
  • 2015-01-06
相关资源
最近更新 更多