Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django使用额外字段注册_Django - Fatal编程技术网

Django使用额外字段注册

Django使用额外字段注册,django,Django,我用UserCreationForm扩展了我的注册表单,并激活了电子邮件。所有这些都很完美,但我不明白如何处理新变量。 我无法在模板中显示它,也无法在用户管理面板中找到它 forms.py from django import forms from django.contrib.auth.forms import UserCreationForm from customuser.models import User class SignUpForm(UserCreationForm):

我用UserCreationForm扩展了我的注册表单,并激活了电子邮件。所有这些都很完美,但我不明白如何处理新变量。 我无法在模板中显示它,也无法在用户管理面板中找到它

forms.py

from django import forms
from django.contrib.auth.forms import UserCreationForm
from customuser.models import User

class SignUpForm(UserCreationForm):
    phone = forms.CharField(max_length= 20)   #<--my new variable 

    class Meta:
        model = User
        fields = ('phone', 'email', 'password1', 'password2',)
def signup(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.is_active = False
            user.save()
            current_site = get_current_site(request)
            mail_subject = 'Activate your blog account.'
            message = render_to_string('reg/acc_active_email.html', {
                'user': user,
                'domain': current_site.domain,
                'uid':urlsafe_base64_encode(force_bytes(user.pk)),
                'token':account_activation_token.make_token(user),
            })
            to_email = form.cleaned_data.get('email')
            email = EmailMessage(
                        mail_subject, message, to=[to_email]
            )
            email.send()
            return HttpResponse('Please confirm your email address to complete the registration')
    else:
        form = SignUpForm()
    return render(request, 'reg/signup.html', {'form': form})


def activate(request, uidb64, token):
    try:
        uid = force_text(urlsafe_base64_decode(uidb64))
        user = User.objects.get(pk=uid)
    except(TypeError, ValueError, OverflowError, User.DoesNotExist):
        user = None
    if user is not None and account_activation_token.check_token(user, token):
        user.is_active = True
        user.save()
        login(request, user)
        # return redirect('index')
        return HttpResponse('Thank you for your email confirmation. Now you can login your account.')
    else:
        return HttpResponse('Activation link is invalid!')
from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.db import models
from django.utils.translation import ugettext_lazy as _


class UserManager(BaseUserManager):
    """Define a model manager for User model with no username field."""

    use_in_migrations = True

    def _create_user(self, email, password, **extra_fields):
        """Create and save a User with the given email and password."""
        if not email:
            raise ValueError('The given email must be set')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password=None, **extra_fields):
        """Create and save a regular User with the given email and password."""
        extra_fields.setdefault('is_staff', False)
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(email, password, **extra_fields)

    def create_superuser(self, email, password, **extra_fields):
        """Create and save a SuperUser with the given email and password."""
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self._create_user(email, password, **extra_fields)

class User(AbstractUser):
    """User model."""

    username = None
    email = models.EmailField(_('email address'), unique=True)


    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = UserManager()
如果我尝试在html模板中插入phone,比如{{user.phone},我什么都看不到。如果我尝试像这样在admin.py文件中添加phone

管理员

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as DjangoUserAdmin
from django.utils.translation import ugettext_lazy as _
from .models import User

@admin.register(User)
class UserAdmin(DjangoUserAdmin):
    """Define admin model for custom User model with no email field."""

    fieldsets = (
        (None, {'fields': ('email', 'phone' ,'password',)}),
        (_('Personal info'), {'fields': ('first_name', 'last_name')}),
        (_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser',
                                       'groups', 'user_permissions')}),
        (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'password1', 'password2'),
        }),
    )
    list_display = ('email', 'first_name', 'last_name', 'is_staff')
    search_fields = ('email', 'first_name', 'last_name')
    ordering = ('email',)
出现错误

Unknown field(s) (phone) specified for User. Check fields/fieldsets/exclude attributes of class UserAdmin.
我的自定义用户模型

型号.py

from django import forms
from django.contrib.auth.forms import UserCreationForm
from customuser.models import User

class SignUpForm(UserCreationForm):
    phone = forms.CharField(max_length= 20)   #<--my new variable 

    class Meta:
        model = User
        fields = ('phone', 'email', 'password1', 'password2',)
def signup(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.is_active = False
            user.save()
            current_site = get_current_site(request)
            mail_subject = 'Activate your blog account.'
            message = render_to_string('reg/acc_active_email.html', {
                'user': user,
                'domain': current_site.domain,
                'uid':urlsafe_base64_encode(force_bytes(user.pk)),
                'token':account_activation_token.make_token(user),
            })
            to_email = form.cleaned_data.get('email')
            email = EmailMessage(
                        mail_subject, message, to=[to_email]
            )
            email.send()
            return HttpResponse('Please confirm your email address to complete the registration')
    else:
        form = SignUpForm()
    return render(request, 'reg/signup.html', {'form': form})


def activate(request, uidb64, token):
    try:
        uid = force_text(urlsafe_base64_decode(uidb64))
        user = User.objects.get(pk=uid)
    except(TypeError, ValueError, OverflowError, User.DoesNotExist):
        user = None
    if user is not None and account_activation_token.check_token(user, token):
        user.is_active = True
        user.save()
        login(request, user)
        # return redirect('index')
        return HttpResponse('Thank you for your email confirmation. Now you can login your account.')
    else:
        return HttpResponse('Activation link is invalid!')
from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.db import models
from django.utils.translation import ugettext_lazy as _


class UserManager(BaseUserManager):
    """Define a model manager for User model with no username field."""

    use_in_migrations = True

    def _create_user(self, email, password, **extra_fields):
        """Create and save a User with the given email and password."""
        if not email:
            raise ValueError('The given email must be set')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password=None, **extra_fields):
        """Create and save a regular User with the given email and password."""
        extra_fields.setdefault('is_staff', False)
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(email, password, **extra_fields)

    def create_superuser(self, email, password, **extra_fields):
        """Create and save a SuperUser with the given email and password."""
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self._create_user(email, password, **extra_fields)

class User(AbstractUser):
    """User model."""

    username = None
    email = models.EmailField(_('email address'), unique=True)


    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = UserManager()

您需要了解Django中
表单
模型
之间的区别。
Form
(也是
ModelForm
)就是它所说的,是您呈现给用户的HTML表单的Django表示。它的唯一目的是通过POST请求轻松提交数据

表单不能只保存到数据库,除非有底层模型。使用普通的
表单
,您必须在视图中处理POST请求:

if request.method == 'POST':
    form = MyForm(data=request.POST)
    if form.is_valid():
        my_model = MyModel(param1=form.cleaned_data['param1'], ...)
        my_model.save()
        return redirect(success_url)
    ...
如您所见,模型和表单都必须具有相应的字段(在上面的示例中,
param1
,等等)

为了更容易为模型创建表单,Django为您提供了一个
ModelForm
,其中表单“知道”如何保存基础模型,因此您可以执行以下操作:

if request.method == 'POST':
    form = MyModelForm(data=request.POST)
    if form.is_valid():
        my_model = form.save()
        ...
在这种情况下,表单会将表单字段映射到模型字段,因此只能保存模型上存在的那些模型字段。您的表单可以包含5个未在模型上定义的额外字段,但仍然有效,但在保存表单时这些字段不会发生任何变化,因为模型没有这些字段


完整的文档是。

很遗憾,我们不知道您的用户模型(
来自customuser.models import User
),它是否有
电话
字段?不,我首先添加了我的自定义用户moodel,为什么要定义电子邮件(这已经在
AbstractUser
中定义了)?第二,你应该在你的用户模型中添加一个
phone
字段,否则你的表单将无法保存电话输入。我不需要用户名字段,而是想使用email字段。我只找到了这个方法。如何在我的类用户(AbstractUser)中添加phone字段,例如phone=forms.CharField(max_length=20)?我的url是
url(r'^profile/$,views.User_profile)
我的视图是
@login\u required def User\u profile(request):返回呈现(request,'client/profile.html')
和在my settings.py
登录重定向URL='/profile/'
。由于这个原因,我不能根据请求转移pk或其他变量。