django 在Dajngo中,UserCreationForm或其父类是否处理POST和GET逻辑?或者是怎么处理的?

omjgkv6w  于 2023-07-01  发布在  Go
关注(0)|答案(1)|浏览(116)

我是django的新手,我正在检查一些我不理解的代码。我查看了django源代码,试图找出Django的类UserCreationFrom(粘贴在下面)是否为您处理POST的逻辑,或者是否在其他地方实现了这一点。
为了澄清,我一直看到一个用于呈现表单的类,然后是某种类型的视图来验证数据。它通常是这样的:
表格类别:

class UserForm(forms.ModelForm):
     class Meta:
         model = User
         fields = ("first_name", "last_name")

浏览次数:

def update_profile(request):
    if request.method == "POST":
        user_form = UserForm(request.POST, instance=request.user)
    if user_form.is_valid():
        user_form.save()
        return redirect("somewhere")
    else:
        user_form = UserForm(instance=request.user)
        return render(request, "profile.html", {"user_form":user_form})

这种实现是有意义的。
我不明白的是,当有一个呈现表单的视图,但表单本身处理验证并省略了if request.method == "POST"逻辑时,如上所示。或者这是在什么家长课上?这两个中的任何一个也符合django约定吗?
举个例子:
类视图:

class UserSignupView(CreateView):
    model = CustomUser
    form_class = UserProfileSignupForm
    template_name = 'signup_form.html'

    def get_context_data(self, **kwargs):
        kwargs['is_confused'] = True
        return super().get_context_data(**kwargs)
    
    def form_valid(self, form):
        user = form.save()
        login(self.request, user)
        return redirect('somewhere')

那么形式及其逻辑将是这样的:

class UserSignUpForm(UserCreationForm):
   class Meta(UserCreationForm.Meta):
       model = User

   def save(self):
         user = super().save(commit=False)
         user.is_confused = True
         user.save()
         return user

任何建议和澄清都非常感谢。
就像我说的,我已经看过django文档了,但还是找不到。我想我错过了一些基本的东西,或者我的代码没有在这里呈现完整的故事。为了澄清以下形式是为了同一件事,尽管它们不是为了同一目的。我从一个模型/应用程序中得到一个,另一个来自另一个。我假设可以稍微修改一下,并在需要此功能的任何地方使用。

jrcvhitl

jrcvhitl1#

一般来说,Django Form不处理GET与POST逻辑,这通常由视图处理。
用户表单由auth视图中的login/logout视图处理。
您可以用途:

urlpatterns = [
    path("accounts/", include("django.contrib.auth.urls")),
]

将所有身份验证视图包含在其标准位置中,或者您可以将各个视图添加到urls.py(例如LoginView和朋友)以进行更细粒度的控制。
这些基于类的视图继承自generic form handling class based view和/或generic editing views
最终,基于类的视图的工作方式是,它们实际上只是普通的基于函数的视图,但它们被实现为一个类,提供了一些公共逻辑和一些钩子函数,您可以重写这些钩子函数以自定义通用行为。

相关问题