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)
Überprüfen Sie die Rolle von request.POST nach der Formularübergabe und speichern Sie sie entsprechend. –
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