【问题标题】:How can you use a request.user in model form in django?如何在 django 中以模型形式使用 request.user?
【发布时间】:2022-01-21 13:57:37
【问题描述】:

我希望能够在模型表单初始化中使用 request.user。这是我的看法:

def create(request, pk):    
    if request.method == 'POST':
        form = CreateForm(request.POST)
        if form.is_valid():
            object = form.save()
            object.save()
            return render(request, 'going_create.html', {'object':object})
    else:
        form = CreateForm()
    return render(request, 'being_create.html', {'form':form})

基本上,我需要 request.user 来预填充 django 表单字段。这是我的表格:

class CreateForm(forms.ModelForm):
    
    def __init__(self, *args, **kwargs):

        self.request = kwargs.pop('request')
        super(CreateForm, self).__init__(*args, **kwargs)
        self.fields['first_name'].initial = self.request.user.first_name

    class Meta:
        model = creater
        fields = (
            'first_name',
        )

此外,如果 request.method == 'POST' 则有 form = CreateForm(request.POST),否则有 form = CreateForm()。所以,由于我不熟悉使用函数视图,我希望你能告诉我我需要在哪里添加代码,以便我可以使用 request.user 预填充 django 字段。谢谢,如有任何问题,请留下。

【问题讨论】:

    标签: django django-models django-views django-forms django-templates


    【解决方案1】:

    你通过一个参数传递它:

    class CreateForm(forms.ModelForm):
        
        def __init__(self, *args, user=None, **kwargs):
            super(CreateForm, self).__init__(*args, **kwargs)
            if user is not None:
                self.fields['first_name'].initial = user.first_name
    
        class Meta:
            model = creater
            fields = (
                'first_name',
            )

    然后在视图中构建表单:

    from django.contrib.auth.decorators import login_required
    
    @login_required
    def create(request, pk):    
        if request.method == 'POST':
            form = CreateForm(request.POST, user=request.user)
            if form.is_valid():
                object = form.save()
                return render(request, 'going_create.html', {'object':object})
        else:
            form = CreateForm(user=request.user)
        return render(request, 'being_create.html', {'form':form})

    注意:如果 POST 请求成功,请发送redirect [Django-doc] 实施Post/Redirect/Get pattern [wiki]。 这样可以避免在用户刷新时发出相同的 POST 请求 浏览器。


    注意:您可以使用 @login_required decorator [Django-doc].

    【讨论】:

    • 谢谢,但我的代码似乎不起作用。难道是你在def __init__(self, *args, user=None, **kwargs):中写了user=None
    • @codebuilder:你需要在视图中传递user=request.user。表单(默认情况下)是不知道请求的,因此您需要将请求的用户传递给表单。
    • 哦,等等。实际上,您的代码确实有效!我在运行代码之前忘了做点什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 2015-12-07
    • 2014-10-29
    • 1970-01-01
    • 2021-03-03
    • 2017-06-20
    相关资源
    最近更新 更多