如何在 Django 中以模型形式使用 request.user?

How can you use a request.user in model form in django?

我希望能够在模型表单初始化中使用 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',
        )

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

您通过参数传递它:

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

    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<strong>, user=request.user</strong>)
        if form.is_valid():
            object = form.save()
            return render(request, 'going_create.html', {'object':object})
    else:
        form = CreateForm(<strong>user=request.user</strong>)
    return render(request, 'being_create.html', {'form':form})

Note: In case of a successful POST request, you should make a redirect [Django-doc] to implement the Post/Redirect/Get pattern [wiki]. This avoids that you make the same POST request when the user refreshes the browser.


Note: You can limit views to a view to authenticated users with the @login_required decorator [Django-doc].