首页 > 解决方案 > 如何从表单中捕获 first_name?

问题描述

我如何才能将 first_name 放入上下文中。

class NewTeacherView(LoginRequiredMixin,CreateView):
    model = TeacherData
    form_class = TeachersForm
    template_name = 'new_teacher.html'
    #template_name = 'new_teacher.html'
    success_url = reverse_lazy('teachers')

    def get_context_data(self, *args, **kwargs):
        context = super(NewTeacherView,self).get_context_data(*args, **kwargs)
        context["user"] = User.objects.create_user(
            username=???????
            password=???????)
        return context

表格如下

class TeachersForm(forms.ModelForm):
    class Meta:
        model = TeacherData
        fields = ("first_name","last_name")
        
        widgets = {
            "first_name":forms.TextInput(attrs={"class":'form-control'}),
            "last_name":forms.TextInput(attrs={"class":'form-control'}),
        }

我的兴趣和愿望是同时first_name使用usernamepassword

标签: python-3.xdjangodjango-views

解决方案


如果表单有效并保存对象,则不应尝试覆盖get_context_data,而是应覆盖form_valid调用:

class NewTeacherView(LoginRequiredMixin,CreateView):
    model = TeacherData
    form_class = TeachersForm
    template_name = 'new_teacher.html'
    #template_name = 'new_teacher.html'
    success_url = reverse_lazy('teachers')
    
    def form_valid(self, form):
        response = super().form_valid(form)
        teacher_data = self.object
        first_name = teacher_data.first_name
        # Best normalize this using:
        # first_name = User.normalize_username(first_name)
        # Also first names are not guaranteed to be unique, you should write some code for that case
        user = User.objects.create_user(username=first_name, password=first_name)
        return response

推荐阅读