2017-12-24 6 views
0

Bereits registrierter Benutzername kann im Benutzererstellungsformular registriert werden. Ich mache Django-Anwendung. Ich schrieb in views.pyBereits registrierter Benutzername kann registriert werden

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}) 

in 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> 

in 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' 

Jetzt in diesem Registrierungsformular, wenn ich bereits Benutzernamen registriert schreiben & E-Mail & Passwort, diese Daten sind nicht registriert, sondern detail.html ist geladen. Ich möchte eine Warnung anzeigen, wenn ich das möchte "Dieser Benutzername ist bereits registriert". Warum ist meine Webseite nicht meine ideale? Warum kann ich bereits registrierten Benutzernamen in meiner Site widerstehen? Wie soll ich das beheben? Ich habe in models.py kein Benutzermodell erstellt.

+0

Können Sie Ihr Modell und Formular posten? Ich schlage vor, E-Mail/Benutzername einzigartig in Modell selbst –

Antwort

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() 
+0

thx ur answer.Ich habe eine Frage.Den Benutzer von User.objects.get (Benutzername = Benutzername, E-Mail = E-Mail) nicht verwenden? – user8817674

+0

Ich habe dich nicht verstanden. Kannst du bitte eine klare Nachricht schreiben? –

+0

Es bedeutet Benutzervariable wird nicht in Codes verwendet. Ist es richtig? – user8817674

0

Ich empfehle, ein benutzerdefiniertes Modell zu verwenden und auth zu erweitern. Wenn "unique" auf "true" festgelegt ist, löst django fill standardmäßig einen Formularfehler beim Senden aus.

In 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: außer Kraft setzen, wo immer erforderlich. Schlagen Sie auch in den Django-Tutorials und simpleisbetterthancomplex suchen. Herr Vitor hat ein einfaches Tutorial

+0

Ich denke, Sie haben es versäumt zu erwähnen; Wenn Sie AbstractUser erben, müssen Sie 'AUTH_USER_MODEL' in der Einstellungsdatei setzen: https://docs.djangoproject.com/de/2.0/topics/auth/customizing/#substituting-a-custom-user-model – Gahan

+0

thx ur answer. Ich habe kein Benutzermodell in models.py.Wie soll ich das beheben? Ich habe meine Frage aktualisiert. – user8817674

Verwandte Themen