我是Django的新手,正在复习一些我不理解的代码.我查看了Django的源代码,试图找出Django的类UserCreationFrom(粘贴在下面)是否为您处理POST逻辑,或者这是否在其他地方实现.

为了澄清这一点,我看到了一个用于呈现表单的类,然后是验证数据的某种类型的视图.它通常是这样的:

Form类:

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 观点:

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的文档,但无法弄清楚这一点.我想我遗漏了一些基本的东西,或者如果我的代码没有在这里呈现完整的故事.要澄清的是,以下表格是针对同一事物的,尽管它们的目的并不相同.我从一个型号/应用程序上得到了一个,从另一个模型/应用程序中得到了另一个.我认为两者都可以稍加修改,并在需要此功能的任何地方使用.

推荐答案

通常,Django表单不处理GET和POST逻辑,这通常由视图处理.

用户表单由auth views中的登录/注销视图处理.

您可以使用:

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

将所有身份验证视图包括在它们的标准位置,或者您可以将单独的视图添加到urls.py中(例如,LoginView和Friends),以实现更细粒度的控制.

这些基于类的视图继承自generic form handling class based view和/或generic editing views.

归根结底,基于类的视图的工作方式是,它们实际上只是幕后基于常规函数的视图,但它们是作为一个类实现的,该类提供了一些通用逻辑和一些钩子函数,您可以重写这些函数来定制泛型行为.

Python相关问答推荐

获取2个字节之间的异或

Asyncio与队列的多处理通信-仅运行一个协程

计算每月过go x年的平均值

手动为pandas中的列上色

云上Gunicorn的Flask-socketIO无法工作

socket.gaierror:[Errno -2]名称或服务未知|Firebase x Raspberry Pi

使用Python Cerberus初始化一个循环数据 struct (例如树)(v1.3.5)

如何根据情况丢弃大Pandas 的前n行,使大Pandas 的其余部分完好无损

在Python中为变量的缺失值创建虚拟值

使用pandas、matplotlib和Yearbox绘制时显示错误的年份

Class_weight参数不影响RandomForestClassifier不平衡数据集中的结果

在内部列表上滚动窗口

rame中不兼容的d类型

try 将一行连接到Tensorflow中的矩阵

PyQt5,如何使每个对象的 colored颜色 不同?'

海上重叠直方图

使用密钥字典重新配置嵌套字典密钥名

转换为浮点,pandas字符串列,混合千和十进制分隔符

解决调用嵌入式函数的XSLT中表达式的语法移位/归约冲突

pysnmp—lextudio使用next()和getCmd()生成器导致TypeError:tuple对象不是迭代器''