访问请求从forms.Form获取与用户相关的dB数据 [英] Access request from the forms.Form to get data from dB related to user

查看:168
本文介绍了访问请求从forms.Form获取与用户相关的dB数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以基本的任务是:将选项中的模板名称和文本添加到 ChoiceField 选择器窗口小部件到使用来自dB的数据链接到经过身份验证的用户。 模板是一个与用户相连的模型,作为 ForeignKey



我想通过链接到连接视图的Form类访问请求数据(用户),如 django.views.generic.View 类。



我已经检查过类似的问题:
对FormView中的get_form_kwargs好奇



这里:从Django中的基于类的通用视图将Request.user对象发送到ModelForm



,这里: Django:在forms.py clean函数中访问请求



但是,它们并没有用非 - code > FormView 类。而且由于这是相当古老的解决方案,如果从 forms.Form 类获得请求更有可能的方法,我很好奇。



这是我的代码:



views.py

  class InformFill(View):
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')
/ pre>

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 the ChoiceField with Selector widget to the form using the data from dB linked to the authenticated User only. Template is a model linked to user as a ForeignKey.

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 reach request from forms.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 some js/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数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆