如何改写django的user
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何改写django的user相关的知识,希望对你有一定的参考价值。
参考技术A 虽然可以这样做,但不建议改写User,建议通过OneToOne继承来扩展User数据。如何在 django 中以模型形式使用 request.user?
【中文标题】如何在 django 中以模型形式使用 request.user?【英文标题】:How can you use a request.user in model form in django? 【发布时间】: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 字段。谢谢,如有任何问题,请留下。
【问题讨论】:
【参考方案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
。表单(默认情况下)是不知道请求的,因此您需要将请求的用户传递给表单。
哦,等等。实际上,您的代码确实有效!我在运行代码之前忘了做点什么。以上是关于如何改写django的user的主要内容,如果未能解决你的问题,请参考以下文章