已经注册的用户名可以注册

时间:2017-12-24 05:43:38

标签: python html django

已注册的用户名可以在用户创建表单中注册。我正在制作Django应用程序。 我在views.py中写道

def regist(request):
    regist_form = RegisterForm(request.POST or None)
    context = {
        'regist_form': regist_form,
    }
    return render(request, 'registration/regist.html', context)

def regist_save(request):

    regist_form = RegisterForm(request.POST or None)

    if request.method == "POST" and regist_form.is_valid():
                regist = regist_form.save(commit=False)
                regist.is_staff = True
                regist.save()

                advertisements = Advertisement.objects.all()
    return render(request, 'registration/detail.html', {'advertisements': advertisements})

在regist.html中

<form class="form-horizontal" action="/accounts/regist_save/" method="POST">

          <div class="form-group-lg">

            <label for="id_username">Username</label>

            {{ regist_form.username }}
            <p class="help-block">{{ regist_form.username.help_text }}</p>
          </div>

          <div class="form-group-lg">

            <label for="id_email">Email</label>

            {{ regist_form.email }}
            <p class="help-block">{{ regist_form.email.help_text }}</p>
          </div>

          <div class="form-group-lg">

            <label for="id_password">Password</label>

            {{ regist_form.password1 }}
            <p class="help-block">{{ regist_form.password1.help_text }}</p>

          </div>

          <div class="form-group-lg">
            <label for="id_password">Password(Confirmation)</label>

            {{ regist_form.password2 }}
            <p class="help-block">{{ regist_form.password2.help_text }}</p>

          </div>

          <div class="form-group-lg">
            <div class="col-xs-offset-2">
              <button type="submit" class="btn-lg regist">Register</button>

              <input name="next" type="hidden" />

            </div>
          </div>
          {% csrf_token %}

        </form>

在forms.py

class RegisterForm(UserCreationForm):
    class Meta:
        model = User
        fields = ('username', 'email','password1','password1',)
    def __init__(self, *args, **kwargs):
        super(RegisterForm, self).__init__(*args, **kwargs)
        self.fields['username'].widget.attrs['class'] = 'form-control'
        self.fields['email'].widget.attrs['class'] = 'form-control'
        self.fields['password1'].widget.attrs['class'] = 'form-control'
        self.fields['password2'].widget.attrs['class'] = 'form-control'

现在在此用户注册表单中,如果我已经注册了已注册的用户名和电子邮件和密码,则这些数据未注册,但detail.html已加载。如果我这样做,我想要显示警告,例如“此用户名已经注册”。为什么我的网页不是我理想的网页?为什么我可以抵制我网站上已注册的用户名?我该怎么解决这个问题?我没有在models.py中创建用户模型。

2 个答案:

答案 0 :(得分:2)

from django.contrib.auth.models import User
from django.contrib import messages
from django.db.models import Q

if request.method == "POST" and regist_form.is_valid():
    try:
        username = form.cleaned_data.get('username', None)
        email = form.cleaned_data.get('email', None)
        # if username or email already exist in the User table
        # if you want to use the user object you can make it

        # if you want to check username and email with or, then it would work
        user = User.objects.get(Q(username=username) | Q(email=email))
        # if you want to check username and email with and, then it would work
        user = User.objects.get(username=username, email=email)

        # else if you have no username but only email you just only filter for email
        user = User.objects.get(email=email)

        # else if no need for user detail, you can do this
        User.objects.get(Q(username=username) | Q(email=email))
        messages.warning(request, 'That detailed use is already available.')
        # return to register form / template page
        # whatever your page is
    except User.DoesNotExist:
        # save the user
        regist = regist_form.save(commit=False)
        regist.is_staff = True
        regist.save()

答案 1 :(得分:0)

我建议使用自定义模型并扩展身份验证。默认情况下,如果unique设置为true,则django fill会在提交期间引发表单错误。

在models.py

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

    username = models.CharField(max_length=128, unique=True)
    email = models.EmailField(_('email address'), unique=True)

    def __str__(self):
        return self.username

PS:覆盖任何需要的地方。还建议查看django教程和simpleisbetterthancomplex。 Vitor先生有一个简单的教程