python - 초기화 - django 쿼리문



사용자와 관련된 dB에서 데이터를 가져 오는 forms.Form의 액세스 요청 (1)

다음과 같이 __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)
...

사용자가 외래 키에 의해 db 내의 다른 객체에 링크되어 있으면 다른 객체의 모든 값을 선택 항목으로 가져옵니다.

또한 양식을 만들 때 다음과 같이 사용자를 전달할 수 있습니다.

form= InformForm(user=request.user,data=request.POST)

기본 작업은 인증 된 사용자에게만 링크 된 dB의 데이터를 사용하여 Selector 위젯에서 ChoiceField choices 의 템플리트 이름과 텍스트를 양식에 추가하는 것입니다. Template 은 사용자에게 ForeignKey 로 연결된 모델입니다.

django.views.generic.View 클래스로 연결된 뷰에 연결된 Form 클래스를 통해 요청 데이터 (사용자)에 액세스하고 싶습니다.

비슷한 질문을 여기에서 확인했습니다 : FormView의 get_form_kwargs에 대해 궁금한 점이 있습니다.

여기에서 : 장고에있는 클래스 기반의 일반 뷰에서 request.user 객체를 ModelForm으로 보냅니다.

그리고 여기 : Django : forms.py clean 함수에서 요청에 접근하기

그러나 그들은 FormView 가 아닌 클래스를 기반으로하지 않습니다. 그리고 상당히 오래된 솔루션이기 때문에 forms.Form 클래스에서 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();'}))

일반적으로 말하자면 이처럼 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-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'





django-request