Python 从forms.Form访问请求,以从数据库获取与用户相关的数据

Python 从forms.Form访问请求,以从数据库获取与用户相关的数据,python,django,forms,django-forms,django-request,Python,Django,Forms,Django Forms,Django Request,因此,基本任务是:仅使用链接到已验证用户的dB数据,将模板名称和文本添加到ChoiceField with Selector小部件中的选项到表单中。模板是作为外键链接到用户的模型 我希望通过作为django.views.generic.view类链接到连接视图的表单类访问请求datauser 我在这里检查了类似的问题: 在这里: 在这里: 但是,它们不涉及非FormView类的基础。由于这是一个相当古老的解决方案,我很好奇是否有更可能的方法从forms.Form类获取请求 这是我的密码: vi

因此,基本任务是:仅使用链接到已验证用户的dB数据,将模板名称和文本添加到ChoiceField with Selector小部件中的选项到表单中。模板是作为外键链接到用户的模型

我希望通过作为django.views.generic.view类链接到连接视图的表单类访问请求datauser

我在这里检查了类似的问题:

在这里:

在这里:

但是,它们不涉及非FormView类的基础。由于这是一个相当古老的解决方案,我很好奇是否有更可能的方法从forms.Form类获取请求

这是我的密码:

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();'}))
一般来说,我希望实现如下smth:

`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();'}))`
我很感激任何方法,但我缺乏知识,问新手问题,对此我很抱歉

我只是想得到python方式的解决方案,而不是构建一些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”对象没有属性“fields”

您可以通过如下更改u init_u_u方法将请求传递到表单:

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)
...
form= InformForm(user=request.user,data=request.POST)
如果用户通过外键链接到数据库中的其他对象,则您将获得其他对象的所有值作为选择项

另外,在创建表单时,您可以像这样传递给用户:

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)
...
form= InformForm(user=request.user,data=request.POST)

你想干什么?你能再解释一下吗好的,那么你面临什么问题?我如何从表单中访问请求数据。表单类?表示提交后从表单中获得的数据?通过init将request param传递给表单,并将request设置为self.request=request变量。所以现在您可以在表单方法中以self.request的形式访问请求。出现错误:“InformForm”对象没有属性“fields”,您确定它是这样工作的,还是mb我做得不对…可能是因为我使用的是表单,而不是ModelForm。例如,没有预定义字段。这不是因为它不是ModelForm,这是我的错误,我忘了在子句之前在init中添加super方法,现在我编辑它,检查它,也许它会有所帮助,因为我已经编辑了问题本身-您可以找到代码。我添加了super,它不会抛出错误,但是,该字段根本没有填充。我的意思是没有这样的领域。它是否需要保存或smth才能保留?我明白了,你评论了你的模板字段,所以是的,基本上我们只是为它设置了参数,现在试试我编辑了一下-你现在应该看到ChoiseField了,值应该可以了