问题描述
所以基本的任务是:将选项
中的模板名称和文本添加到 ChoiceField
中选择器
窗口小部件到使用来自dB的数据链接到经过身份验证的用户。 模板
是一个与用户相连的模型,作为 ForeignKey
。
我想通过链接到连接视图的Form类访问请求数据(用户),如 django.views.generic.View
类。
我已经检查过类似的问题:
这里:
,这里:
但是,它们并没有用非 - code > FormView 类。而且由于这是相当古老的解决方案,如果从 forms.Form
类获得请求
更有可能的方法,我很好奇。
这是我的代码:
views.py
class InformFill(View):
/ pre>
form_class = InformForm
temlate_name ='distrib_db / inform_fill.html'
def get(self,请求):
如果request.user.is_authenticated():
form = self.form_class(无)
返回render(request,self.temlate_name,context = {'form':form} )
else:
返回重定向('distrib_db:login')
def post(self,request):
如果request.user.is_authenticated():
form = self.form_class(request.POST)
如果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:
电子邮件,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' = {'pk':inform.id}
除了异常作为e:
return render(request,'distrib_db / sample.html',
context = {'date':date,'飞行编号':flt_numbr,'error':e})
#返回渲染(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();'}))
一般来说,我想实现smth这样:
`cl ass InformForm(forms.Form):
def get_template_choices(self):
templates = self.request.user.template_set.all()
choices = []
for t in模板:
choices.append((t.text,t.name))
返回选项
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
walk-arounds。
谢谢你的时间!
#
@Danielius评论后,我做了一些调整:
`class InformForm(forms.Form):
def __init __(self,user = None,* args,** kwargs):
如果用户:
self.fields ['template'] = forms.ChoiceField(choices = tuple([(template.text,template.name)for 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'对象没有属性'字段'
解决方案您可以通过更改您的
__ init__将请求传递给您的表单
这样的方法:class InformForm(forms.Form):
...
def __init __(self,user = None,* args,** kwargs):
super(InformForm,self).__ init __(** kwargs)
如果用户:
self .fields ['somefield'] = forms.ChoiceField()
self.fields ['somefield']。widget = forms.Select()
self.fields ['somefield']。queryset = Someobject。 objects.filter(User = user)
...
如果用户是li通过外键将数据库中的其他对象扣除,然后您将获取其他对象的所有值作为选择项。
此外,创建表单时,您可以像这样传递用户:
form = InformForm(user = request.user,data = request.POST)
So basic task is: add the template name and text to the
choices
in theChoiceField
withSelector
widget to the form using the data from dB linked to the authenticated User only.Template
is a model linked to user as aForeignKey
.I'd like to access the request data(user) via the Form class linked to the connected view as
django.views.generic.View
class.I've checked similar questions here:Curious about get_form_kwargs in FormView
and here: Sending request.user object to ModelForm from class based generic view in Django
and here: Django: Accessing request in forms.py clean function
However they don't touch base with non-
FormView
classes. And as it's fairly old solutions, I was curious if there's more likely approach to reachrequest
fromforms.Form
class.Here's my code:
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();'}))
Generally speaking i'd like to achieve smth like this:
`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();'}))`
I'd appreciate any approach, mb I lack knowledge and asking newbie questions, sorry about it.
I just wanna get the
python-way
solution rather then build somejs/jinja
walk-arounds.Thank you for your time!
#After @Danielius comments, I've made some adjustments:
`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();'}))`
Got an error
AttributeError: 'InformForm' object has no attribute 'fields'
解决方案You can pass request to your form by changing your
__init__
method like this :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) ...
If the User is linked to other object in db by Foreign key, then you will get all the values of other object as select items.
Also , when creating form you could pass user like this :
form= InformForm(user=request.user,data=request.POST)
这篇关于访问请求从forms.Form获取与用户相关的dB数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!