来自 forms.Form 的访问请求,以从 dB 中获取与用户相关的数据
Access request from the forms.Form to get data from dB related to user
所以基本任务是:将模板名称和文本添加到 ChoiceField
中的 choices
和 Selector
小部件,使用链接到经过身份验证的用户的 dB 中的数据添加到表单只要。 Template
是链接到用户的模型 ForeignKey
。
我想通过链接到连接视图的表单 class 访问请求数据(用户),如 django.views.generic.View
class。
我在这里检查过类似的问题:
Curious about get_form_kwargs in FormView
这里:Sending request.user object to ModelForm from class based generic view in Django
这里:Django: Accessing request in forms.py clean function
然而,他们不与非FormView
classes 打交道。由于它是相当古老的解决方案,我很好奇是否有更可能的方法从 forms.Form
class.
达到 request
这是我的代码:
views.py
class InformFill(View):
form_class = InformForm
temlate_name = 'distrib_db/inform_fill.html'
def get(self, request):
if request.user.is_authenticated():
form = self.form_class(None)
return render(request, self.temlate_name, context={'form': form})
else:
return redirect('distrib_db:login')
def post(self, request):
if request.user.is_authenticated():
form = self.form_class(request.POST)
if form.is_valid():
inform = Inform(flt_numbr=form.cleaned_data['flight_number'], date=form.cleaned_data['date'],
template=form.cleaned_data['text'], user=request.user)
inform.save()
date = form.cleaned_data['date']
flt_numbr = form.cleaned_data['flight_number']
try:
emails, contacts = get_mail_cnt(date, flt_numbr)
# inform = get_object_or_404(Inform, pk=request['pk'])
paxdata = PaxData(inform=inform, emails=' '.join(emails), contacts=' '.join(contacts))
paxdata.save()
return redirect('/inform/{0}/'.format(inform.pk))
# 'distrib_db:detail', context={'pk': inform.id}
except Exception as e:
return render(request, 'distrib_db/sample.html',
context={'date': date, 'flight_number': flt_numbr, 'error': e})
# return render(request, 'distrib_db/sample.html', context={'date': date, 'flt_numbr': flt_numbr})
return render(request, self.temlate_name, context={'form': form})
else:
return redirect('distrib_db:login')
forms.py
class InformForm(forms.Form):
flight_number = forms.CharField(5, widget=forms.TextInput())
date = forms.DateField(widget=forms.DateInput(attrs={'class': 'datepicker'}))
template = forms.ChoiceField(choices=templates, widget=forms.Select(attrs={'id': 'select_box',
'onchange': 'javascript:changer();'}))
text = forms.CharField(widget=forms.Textarea(attrs={'id': 'txt_box', 'class': 'latin',
'maxlength': "160", 'onchange': 'javascript:validateTextArea();'}))
一般来说我想达到这样的效果:
`class InformForm(forms.Form):
def get_template_choices(self):
templates = self.request.user.template_set.all()
choices = []
for t in templates:
choices.append((t.text, t.name))
return choices
flight_number = forms.CharField(5, widget=forms.TextInput())
date = forms.DateField(widget=forms.DateInput(attrs={'class':
'datepicker'}))
template = forms.ChoiceField(choices=get_template_choices(),
widget=forms.Select(attrs=
{'id': 'select_box',
'onchange': 'javascript:changer();'}))
text = forms.CharField(widget=forms.Textarea(attrs={'id': 'txt_box',
'class': 'latin',
'maxlength': "160",
'onchange': 'javascript:validateTextArea();'}))`
我很感激任何方法,mb 我缺乏知识和问新手问题,抱歉。
我只想获得 python-way
解决方案,而不是构建一些 js/jinja
绕行。
感谢您的宝贵时间!
#
根据@Danielius 的评论,我做了一些调整:
`class InformForm(forms.Form):
def __init__(self, user=None, *args, **kwargs):
if user:
self.fields['template'] = forms.ChoiceField(choices=tuple([(template.text, template.name) for template in user.template_set.all()]),
widget=forms.Select(attrs={'id': 'select_box', 'onchange': 'javascript:changer();'}))
flight_number = forms.CharField(5, widget=forms.TextInput())
date = forms.DateField(widget=forms.DateInput(attrs={'class': 'datepicker'}))
# template = forms.ChoiceField(choices=templates, widget=forms.Select(attrs={'id': 'select_box',
# 'onchange': 'javascript:changer();'}))
text = forms.CharField(widget=forms.Textarea(attrs={'id': 'txt_box', 'class': 'latin',
'maxlength': "160", 'onchange': 'javascript:validateTextArea();'}))`
遇到错误AttributeError: 'InformForm' object has no attribute 'fields'
您可以像这样更改 __init__
方法,将请求传递给您的表单:
class InformForm(forms.Form):
...
def __init__(self, user=None,*args, **kwargs):
super(InformForm, self).__init__(**kwargs)
if user:
self.fields['somefield'] = forms.ChoiceField()
self.fields['somefield'].widget = forms.Select()
self.fields['somefield'].queryset = Someobject.objects.filter(User=user)
...
如果用户通过外键链接到数据库中的其他对象,那么您将获得其他对象的所有值作为 select 项。
此外,在创建表单时,您可以像这样传递用户:
form= InformForm(user=request.user,data=request.POST)
所以基本任务是:将模板名称和文本添加到 ChoiceField
中的 choices
和 Selector
小部件,使用链接到经过身份验证的用户的 dB 中的数据添加到表单只要。 Template
是链接到用户的模型 ForeignKey
。
我想通过链接到连接视图的表单 class 访问请求数据(用户),如 django.views.generic.View
class。
我在这里检查过类似的问题: Curious about get_form_kwargs in FormView
这里:Sending request.user object to ModelForm from class based generic view in Django
这里:Django: Accessing request in forms.py clean function
然而,他们不与非FormView
classes 打交道。由于它是相当古老的解决方案,我很好奇是否有更可能的方法从 forms.Form
class.
request
这是我的代码:
views.py
class InformFill(View):
form_class = InformForm
temlate_name = 'distrib_db/inform_fill.html'
def get(self, request):
if request.user.is_authenticated():
form = self.form_class(None)
return render(request, self.temlate_name, context={'form': form})
else:
return redirect('distrib_db:login')
def post(self, request):
if request.user.is_authenticated():
form = self.form_class(request.POST)
if form.is_valid():
inform = Inform(flt_numbr=form.cleaned_data['flight_number'], date=form.cleaned_data['date'],
template=form.cleaned_data['text'], user=request.user)
inform.save()
date = form.cleaned_data['date']
flt_numbr = form.cleaned_data['flight_number']
try:
emails, contacts = get_mail_cnt(date, flt_numbr)
# inform = get_object_or_404(Inform, pk=request['pk'])
paxdata = PaxData(inform=inform, emails=' '.join(emails), contacts=' '.join(contacts))
paxdata.save()
return redirect('/inform/{0}/'.format(inform.pk))
# 'distrib_db:detail', context={'pk': inform.id}
except Exception as e:
return render(request, 'distrib_db/sample.html',
context={'date': date, 'flight_number': flt_numbr, 'error': e})
# return render(request, 'distrib_db/sample.html', context={'date': date, 'flt_numbr': flt_numbr})
return render(request, self.temlate_name, context={'form': form})
else:
return redirect('distrib_db:login')
forms.py
class InformForm(forms.Form):
flight_number = forms.CharField(5, widget=forms.TextInput())
date = forms.DateField(widget=forms.DateInput(attrs={'class': 'datepicker'}))
template = forms.ChoiceField(choices=templates, widget=forms.Select(attrs={'id': 'select_box',
'onchange': 'javascript:changer();'}))
text = forms.CharField(widget=forms.Textarea(attrs={'id': 'txt_box', 'class': 'latin',
'maxlength': "160", 'onchange': 'javascript:validateTextArea();'}))
一般来说我想达到这样的效果:
`class InformForm(forms.Form):
def get_template_choices(self):
templates = self.request.user.template_set.all()
choices = []
for t in templates:
choices.append((t.text, t.name))
return choices
flight_number = forms.CharField(5, widget=forms.TextInput())
date = forms.DateField(widget=forms.DateInput(attrs={'class':
'datepicker'}))
template = forms.ChoiceField(choices=get_template_choices(),
widget=forms.Select(attrs=
{'id': 'select_box',
'onchange': 'javascript:changer();'}))
text = forms.CharField(widget=forms.Textarea(attrs={'id': 'txt_box',
'class': 'latin',
'maxlength': "160",
'onchange': 'javascript:validateTextArea();'}))`
我很感激任何方法,mb 我缺乏知识和问新手问题,抱歉。
我只想获得 python-way
解决方案,而不是构建一些 js/jinja
绕行。
感谢您的宝贵时间!
#根据@Danielius 的评论,我做了一些调整:
`class InformForm(forms.Form):
def __init__(self, user=None, *args, **kwargs):
if user:
self.fields['template'] = forms.ChoiceField(choices=tuple([(template.text, template.name) for template in user.template_set.all()]),
widget=forms.Select(attrs={'id': 'select_box', 'onchange': 'javascript:changer();'}))
flight_number = forms.CharField(5, widget=forms.TextInput())
date = forms.DateField(widget=forms.DateInput(attrs={'class': 'datepicker'}))
# template = forms.ChoiceField(choices=templates, widget=forms.Select(attrs={'id': 'select_box',
# 'onchange': 'javascript:changer();'}))
text = forms.CharField(widget=forms.Textarea(attrs={'id': 'txt_box', 'class': 'latin',
'maxlength': "160", 'onchange': 'javascript:validateTextArea();'}))`
遇到错误AttributeError: 'InformForm' object has no attribute 'fields'
您可以像这样更改 __init__
方法,将请求传递给您的表单:
class InformForm(forms.Form):
...
def __init__(self, user=None,*args, **kwargs):
super(InformForm, self).__init__(**kwargs)
if user:
self.fields['somefield'] = forms.ChoiceField()
self.fields['somefield'].widget = forms.Select()
self.fields['somefield'].queryset = Someobject.objects.filter(User=user)
...
如果用户通过外键链接到数据库中的其他对象,那么您将获得其他对象的所有值作为 select 项。
此外,在创建表单时,您可以像这样传递用户:
form= InformForm(user=request.user,data=request.POST)