有沒有更好的方法從下面的代碼中獲取用戶物件forms.py?
楷模
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
...
表格.py
class FooForm(forms.Form):
def __init__(self, *args, **kwargs):
self.request = kwargs.pop("user")
super(ExperienceStart, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_method = 'post'
self.helper.layout = Layout(InlineRadios('topics'),)
hardcoded_username = "johndoe" # i want to find a way not to hardcode this
current_user = User.objects.filter(username=hardcoded_username).first()
profile = Profile.objects.filter(user=current_user).first()
...
profile_values = list(zip(profile, profile))
profile = forms.TypedChoiceField(
label="Select a Profile",
choices=profile_values,
coerce=str,
widget=forms.RadioSelect,
initial=profile[0],
required=True)
視圖.py
def foo(request):
form = fooForm(request.POST, user=request.user)
print(form.request) # i have already tried this but i want to get it in form not views
if request.method == "POST":
if form.is_valid():
# do something
else:
form = fooForm(user=request.user)
context = {"form": form}
我正在嘗試找到一種方法來不對用戶名進行硬編碼forms.py并獲取當前登錄的用戶。
uj5u.com熱心網友回復:
不要將其包含在表格中。表單通常是不知道請求的,而且還用于處理來自 HTML 表單的輸入。
您可以使用initial=…表單的引數來指定初始專案。
在您的表單中,您可以使用ModelChoiceField[Django-doc]來選擇一個Profile專案:
class FooForm(forms.Form):
profile = forms.ModelChoiceField(
label='Select a Profile',
queryset=Profile.objects.all(),
widget=forms.RadioSelect,
required=True
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_method = 'post'
self.helper.layout = Layout(InlineRadios('topics'))
然后在視圖中,您可以將用戶的個人資料作為初始值傳遞:
from django.shortcuts import redirect, render
from django.contrib.auth.decorators import login_required
@login_required
def foo(request):
if request.method == 'POST':
form = fooForm(request.POST, initial={'profile': request.user.profile})
if form.is_valid():
# do something
return redirect('name-of-some-view')
else:
form = fooForm(initial={'profile': request.user.profile})
context = {'form': form}
return render(request, 'some_template.html', context)
注意:您可以使用
@login_required裝飾器 [Django-doc]將視圖限制為經過身份驗證的用戶的視圖 。
注意:如果 POST 請求成功,您應該制作一個
redirect[Django-doc] 來實作Post/Redirect/Get模式 [wiki]。這樣可以避免在用戶重繪 瀏覽器時發出相同的 POST 請求。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/411289.html
標籤:
下一篇:Python字串突變
