python - Django,注册扩展用户模型

标签 python django django-registration django-users

我已将 djago 的用户模型扩展为模型教师。教师有 3 个字段:

  • 用户(一对一字段与用户)
  • 模块(多对多字段到模块)
  • 已确认( bool 值)

所以我得到了一份适用于非教师的注册表,并为教师复制了它。当用户从教师注册表单注册时,我试图保存教师的 3 个额外字段。

注册应该可以进行,因为它与普通用户的形式相同,但必须保存教师的 3 个附加字段。

我读到,由于 modules 是一个 ManyToManyField 我必须使用 save_m2m() 但我不知道如何获取该值从表单中选择多个字段。

模型.py

class Teacher(models.Model):
    user = models.OneToOneField(User)
    modules = models.ManyToManyField(Module)
    confirmed = models.BooleanField(default=False)

表单.py

class RegistrationFormTeacher(UserCreationForm):
    email = forms.EmailField(required=True)
    modules = forms.SelectMultiple()

    class Meta:
        model = User
        fields = ('username', 'email', 'password1', 'password2')

    def save(self, commit=True):
        user = super(RegistrationFormTeacher, self).save(commit=False)
        user.email = self.cleaned_data['email']

        if commit:
            user.save()

        return user

View .py

def register_teacher(request):
    args = {}
    universities = University.objects.order_by('name').distinct()

    if request.method == 'POST':
        form = RegistrationFormTeacher(request.POST)
        if form.is_valid():
            new_teacher = form.save(commit=False)
            new_teacher.modules = form.cleaned_data['modules']
            new_teacher.save()
            form.save_m2m()
            return HttpResponseRedirect(reverse('dashboard_teacher'))
    else:
        form = RegistrationFormTeacher()
    args['form'] = form
    return render_to_response("registration/registration_form_teacher.html", {'universities': universities}, RequestContext(request))

最佳答案

您想要创建一个 Teacher 模型,但您的模型表单的模型是 User - 因此您没有按照您想要的方式保存您想要的内容。

绝对最简单但不一定是最优雅的方法是使用两个单独的表单。

class UserRegistrationForm(UserCreationForm):
    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'username', 'password1', 'password2')


class RegistrationFormTeacher(forms.ModelForm):
    class Meta:
        model = Teacher
        fields = (modules, confirmed)

然后当您处理 RegistrationFormTeacher 时:

if request.method == 'POST':
    form = RegistrationFormTeacher(request.POST)
    if form.is_valid():
        new_teacher = form.save(commit=False)
        new_teacher.user = request.user #get the user object however you want - you 
            #can pass the user ID to the view as a parameter and do 
            #User.objects.get(pk=id) or some such, too. 
        new_teacher.save()
        form.save_m2m()

关于python - Django,注册扩展用户模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23315337/

相关文章:

python - 如何更改我的 seaborn catplot 中的数字或行和列

django - 没有名为 backends.simple.urls 的模块

Django 。如何减少每次使用后的优惠券总数

python - Django Forms 无法呈现单选按钮

django - 如何在登录时使用django-registration和auth设置 session 变量?

python - django-registration 和包含 hashtag 的重定向

python - 如何将 value_counts() 输出转换为数据帧?

python - 如何使用 lxml 获取元素

python - 如何在列表中查找具有属性的元素?

python - django 社交身份验证多帐户关联