2017-03-15 3 views
0

Ich bin neu in Django und möchte eine Registrierungsseite für meine Webanwendung erstellen. Derzeit benötige ich zwei Arten von Benutzern (Student und Instructor). Ich habe eine Checkbox für den Benutzer, um auszuwählen, ob sie Student oder Instructor in meiner RegistrationForm sind. Ich würde gerne wissen, dass ich unter meiner Registrierungsform, wie ich sie in Student oder Instructor-Tabelle jeweils unter der save() -Methode speichern?Django speichert mehrere Benutzertypen

register.py

class RegistrationForm(forms.ModelForm): 
    email = forms.EmailField(widget=forms.TextInput(attrs={'placeholder': 'Email'}), label='') 
    password1 = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder': 'Password'}), label='') 
    password2 = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder': 'Confirm Password'}), label='') 
    INSTRUCTOR = "INS" 
    STUDENT = "STU" 
    roles_choices = [(INSTRUCTOR, "Instructor"), (STUDENT, "Student")] 
    role = forms.ChoiceField(choices=roles_choices, widget=forms.RadioSelect(), label='') 

    class Meta: 
     model = User 
     fields = ['email', 'password1', 'password2'] 

    def clean(self): 
     """ 
     Verifies that the values entered into the password fields match 

     NOTE: Errors here will appear in ``non_field_errors()`` because it applies to more than one field. 
     """ 
     cleaned_data = super(RegistrationForm, self).clean() 
     if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data: 
      if self.cleaned_data['password1'] != self.cleaned_data['password2']: 
       raise forms.ValidationError("Passwords don't match. Please enter both fields again.") 
     return self.cleaned_data 

    def save(self, commit=True): 
     user = super(RegistrationForm, self).save(commit=False) 
     user.set_password(self.cleaned_data['password1']) 
     user.set_role(self.cleaned_data['role']) 
     if commit: 
      user.save() 
     return user 

models.py

class User(AbstractBaseUser): 
    role = models.CharField(max_length=3) 

    email = models.EmailField(max_length=100, primary_key=True) 
    first_name = models.CharField(max_length=30, null=False) 
    last_name = models.CharField(max_length=30, null=False) 
    password = models.CharField(max_length=100, null=False) 
    is_staff = models.BooleanField(default=False) 

    USERNAME_FIELD = 'email' 

    class Meta: 
     abstract = True 

    def get_absolute_url(self): 
     return "/%s/%s/" % (self.role, urlquote(self.email)) 

    def set_role(self, role): 
     self.role = role 

    def get_role(self): 
     return self.role 

    def get_short_name(self): 
     pass 

    def get_full_name(self): 
     pass 


class Instructor(User): 
    pass 

class Student(User):  
    matric_id = models.CharField(max_length=10, blank=False, null=False) 
+0

Überprüfen Sie die Rolle von request.POST nach der Formularübergabe und speichern Sie sie entsprechend. –

+0

Bevor wir weiter mit Ihrer Frage fortfahren, denke ich, dass es besser ist, "User" als konkretes Modell anstatt als abstrakt zu betrachten, also "Instructor" und "Student" als Profil des "Users". Ich denke, dass ein Benutzer in Wirklichkeit ein Ausbilder und ein Student sein kann. – Yeo

Antwort

1

ich die Studenten und Dozenten Felder als eigenständiges Modell mit einem Benutzer one to one field, damit haben würde können Sie auch die Möglichkeit haben, den gleichen Benutzer als Ausbilder und als Schüler arbeiten zu lassen, wenn das für Ihren Fall funktioniert.

Wie für Ihr Formular können Sie 3 Formulare anzeigen auf der gleichen Seite (eine ist für die reguläre Registrierung und die anderen 2 unterscheiden sich je nachdem, was der Benutzer wählt, Lehrer oder Schüler).

Der speichern Teil kann in der vieces.py getan werden, da Sie 2 Formulare extrahieren und speichern + beide Instanzen verknüpfen können.

Wenn Sie weitere Klarstellungen benötigen, fragen Sie einfach und ich werde gerne einige Code-Schnipsel einfügen.

+0

Danke :) Basierend auf dem Registrierungsformular aus der Frage, kannst du mir ein Beispiel zeigen, wie man die Formulare in drei Teile teilt, die du erwähnt hast, damit ich die Benutzerregistrierungsdetails (E-Mail, Passwort) in Instructor speichern kann oder Student Tisch separat? – stackyyflow

Verwandte Themen