python - enviar - Solicitud de acceso desde los formularios. Formulario para obtener datos de dB relacionados con el usuario
enviar datos de python a php (1)
Puede pasar la solicitud a su formulario cambiando su método __init__
esta manera:
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)
...
Si el usuario está vinculado a otro objeto en db por clave externa, obtendrá todos los valores de otro objeto como elementos seleccionados.
Además, al crear el formulario, puede pasar al usuario de la siguiente manera:
form= InformForm(user=request.user,data=request.POST)
Así que la tarea básica es: agregar el nombre y el texto de la plantilla a las choices
en el widget ChoiceField
with Selector
al formulario utilizando los datos de dB vinculados solo al Usuario autenticado. Template
es un modelo vinculado al usuario como ForeignKey
.
Me gustaría acceder a los datos de solicitud (usuario) a través de la clase de formulario vinculada a la vista conectada como clase django.views.generic.View
.
He consultado preguntas similares aquí: Curioso sobre get_form_kwargs en FormView
y aquí: Enviar objeto request.user a ModelForm desde la vista genérica basada en clases en Django
y aquí: Django: solicitud de acceso en la función clean de forms.py
Sin embargo, no tocan base con clases que no sean FormView
. Y dado que se trata de soluciones bastante antiguas, tenía curiosidad de saber si hay un enfoque más probable para llegar a la request
desde forms.Form
class.
Aquí está mi código:
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();''}))
En términos generales, me gustaría lograr algo así:
`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();''}))`
Apreciaría cualquier enfoque, mb. Me falta conocimiento y hago preguntas a los novatos, lo siento.
Solo quiero obtener la solución python-way
lugar de construir algunos js/jinja
walk-arounds.
¡Gracias por tu tiempo!
#Después de los comentarios de @ Daniel, hice algunos ajustes:
`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();''}))`
Obtuvo un error AttributeError: ''InformForm'' object has no attribute ''fields''