从 Django 中的 forms.py 将参数传递给基于函数的视图
Pass parameter to a function-based view from the forms.py in Django
美好的一天。
我有一个基于函数的视图,想知道如何在 init 函数中准确传递 forms.py 中的 self.update 参数。
Form.py
class AnuncioForm(forms.ModelForm):
justificacion = forms.CharField(widget=forms.Textarea)
motivo = forms.ModelChoiceField(queryset=Catalogo.objects.filter(tipo=MOTIVO_DE_RECTIFICACIONES))
class Meta:
model = Anuncio
def __init__(self, *args, **kwargs):
self.update = kwargs.pop('update', None) # THIS PARAMETER
super(AnuncioForm, self).__init__(*args, **kwargs)
if self.update:
self.fields['motivo'].required = True
self.fields['justificacion'].required = True
基于函数的视图:
def Anuncio_create_update(request, pk=None):
if pk:
anuncio = Anuncio.objects.get(pk=pk)
nave = anuncio.nave
navefoto = NaveFotos.objects.filter(nave_id=nave.id).first()
tipo_navefoto = TipoNave.objects.filter(anu_tipo_nave=anuncio.id).values_list('foto')
historial_anuncio = anuncio.historialedicionanuncios_set.all().select_related('usuario').order_by('-fecha').all()
update = True
anuncio_tmp = anuncio.has_bodega_reporte()
tiene_bodega = anuncio_tmp[0]
title_meta = u'Anuncio de Naves: Actualización'
title = u'Anuncio de Naves'
nav = (
('Panel Mando', '/'),
('Anuncio de naves', reverse('anuncio_list')),
(u'Actualización', '')
)
# muelle = TarjaMuelle.objects.filter(anuncio=pk, tipo_autorizacion=COMUN_SALIDA)
# if muelle is not get_es_directo(tipo_operacion=OPE_EMBARQUE_INDIRECTO):
# pass
else:
anuncio = Anuncio()
tiene_bodega = False
update = False
title_meta = u'Anuncio de Naves: Registro'
title = u'Anuncio de Naves'
nav = (
('Panel Mando', '/'),
('Anuncio de Naves', reverse('anuncio_list')),
('Registro', '')
)
unidad_operativa_id = request.session.get(SESION_UNIDAD_OPERATIVA_ID)
tipo_nave = TipoNave.objects.all().values_list('id', 'descripcion')
tipo_trafico = Catalogo.objects.filter(tipo='16').values_list('id', 'nombre')
lineas = Catalogo.objects.filter(tipo='02').values_list('id', 'nombre')
lista_tipo_carga = get_tipo_carga()
# formset
AnuncioBodegaFormSet = inlineformset_factory(
Anuncio,
AnuncioBodega,
extra=0,
can_delete=True,
fields=(
'anuncio', 'bodega', 'total', 'bultos', 'id')
)
# Planificacion
ArticulosFormSet = inlineformset_factory(
Anuncio,
ArticuloPorAnuncio,
extra=0, can_delete=True,
fields=(
'articulo', 'cantidad_maxima_vehiculos')
)
ProyectosFormSet = inlineformset_factory(
Anuncio, AnuncioProyectos, extra=0, can_delete=True,
fields=(
'escala',
'actividad',
'tipo_trafico',
'ambito',
'articulo',
'tipo_producto'
)
)
if request.method == 'POST':
next = request.GET.get('next')
form = AnuncioForm(request.POST, request.FILES, instance=anuncio)
# navefoto = NaveFotos(request.POST, request.FILES, instance=navefoto)
# tipo_navefoto = TipoNaveForm(request.POST, request.FILES, instance=tipo_navefoto)
articulosFormSet = ArticulosFormSet(request.POST, instance=anuncio)
proyectosformset = ProyectosFormSet(request.POST, instance=anuncio)
tipo_nave_id = form.data.get('tipo_nave', None)
will_redirect = False
if tipo_nave_id:
tipo_nave_obj = TipoNave.objects.get(id=int(tipo_nave_id))
if tipo_nave_obj.requiere_bodega:
anuncioBodegaFormSet = AnuncioBodegaFormSet(request.POST, instance=anuncio)
if form.is_valid() and articulosFormSet.is_valid() and anuncioBodegaFormSet.is_valid() and \
proyectosformset.is_valid():
if update:
user = request.user
motivo = form.cleaned_data['motivo']
justificacion = form.cleaned_data['justificacion']
HistorialEdicionAnuncios.objects.create(historial_anuncios=anuncio, motivo=motivo,
observacion=justificacion, usuario=user)
anuncio = form.save()
anuncioBodegaFormSet.save()
articulosFormSet.save()
proyectosformset.save()
will_redirect = True
else:
if form.is_valid() and articulosFormSet.is_valid() and proyectosformset.is_valid():
if update:
user = request.user
motivo = form.cleaned_data['motivo']
justificacion = form.cleaned_data['justificacion']
HistorialEdicionAnuncios.objects.create(historial_anuncios=anuncio, motivo=motivo,
observacion=justificacion, usuario=user)
anuncio = form.save()
articulosFormSet.save()
proyectosformset.save()
will_redirect = True
if will_redirect:
if pk == None:
return redirect(anuncio.get_anuncio_codigo())
if next == 'new':
return redirect(reverse('anuncio_create'))
if next == 'self':
return redirect(anuncio.get_anuncio_update_url())
else:
return redirect('anuncio_list')
else:
form = AnuncioForm(instance=anuncio)
anuncioBodegaFormSet = AnuncioBodegaFormSet(instance=anuncio)
articulosFormSet = ArticulosFormSet(instance=anuncio)
proyectosformset = ProyectosFormSet(instance=anuncio)
return render('servicio/anuncio_form.html', locals(), context_instance=ctx(request))
我知道在基于 class 的视图中有一个名为 get_form_kwargs 的函数,您可以在其中放置类似 form_kwargs['update'] = True
的内容,仅此而已。但我正在尝试基于功能的视图,但我不知道该怎么做。我将不胜感激对基于功能的这种观点的任何纠正,我最近一直在学习基于功能的这些观点,因为事实是我是该主题的新手。
Ty.
您将 update
传递给表单的方式与传递任何其他 kwarg 的方式相同,例如:
form = AnuncioForm(request.POST, request.FILES, instance=anuncio, update=True)
如果需要,记得更新 GET 分支。
美好的一天。
我有一个基于函数的视图,想知道如何在 init 函数中准确传递 forms.py 中的 self.update 参数。
Form.py
class AnuncioForm(forms.ModelForm):
justificacion = forms.CharField(widget=forms.Textarea)
motivo = forms.ModelChoiceField(queryset=Catalogo.objects.filter(tipo=MOTIVO_DE_RECTIFICACIONES))
class Meta:
model = Anuncio
def __init__(self, *args, **kwargs):
self.update = kwargs.pop('update', None) # THIS PARAMETER
super(AnuncioForm, self).__init__(*args, **kwargs)
if self.update:
self.fields['motivo'].required = True
self.fields['justificacion'].required = True
基于函数的视图:
def Anuncio_create_update(request, pk=None):
if pk:
anuncio = Anuncio.objects.get(pk=pk)
nave = anuncio.nave
navefoto = NaveFotos.objects.filter(nave_id=nave.id).first()
tipo_navefoto = TipoNave.objects.filter(anu_tipo_nave=anuncio.id).values_list('foto')
historial_anuncio = anuncio.historialedicionanuncios_set.all().select_related('usuario').order_by('-fecha').all()
update = True
anuncio_tmp = anuncio.has_bodega_reporte()
tiene_bodega = anuncio_tmp[0]
title_meta = u'Anuncio de Naves: Actualización'
title = u'Anuncio de Naves'
nav = (
('Panel Mando', '/'),
('Anuncio de naves', reverse('anuncio_list')),
(u'Actualización', '')
)
# muelle = TarjaMuelle.objects.filter(anuncio=pk, tipo_autorizacion=COMUN_SALIDA)
# if muelle is not get_es_directo(tipo_operacion=OPE_EMBARQUE_INDIRECTO):
# pass
else:
anuncio = Anuncio()
tiene_bodega = False
update = False
title_meta = u'Anuncio de Naves: Registro'
title = u'Anuncio de Naves'
nav = (
('Panel Mando', '/'),
('Anuncio de Naves', reverse('anuncio_list')),
('Registro', '')
)
unidad_operativa_id = request.session.get(SESION_UNIDAD_OPERATIVA_ID)
tipo_nave = TipoNave.objects.all().values_list('id', 'descripcion')
tipo_trafico = Catalogo.objects.filter(tipo='16').values_list('id', 'nombre')
lineas = Catalogo.objects.filter(tipo='02').values_list('id', 'nombre')
lista_tipo_carga = get_tipo_carga()
# formset
AnuncioBodegaFormSet = inlineformset_factory(
Anuncio,
AnuncioBodega,
extra=0,
can_delete=True,
fields=(
'anuncio', 'bodega', 'total', 'bultos', 'id')
)
# Planificacion
ArticulosFormSet = inlineformset_factory(
Anuncio,
ArticuloPorAnuncio,
extra=0, can_delete=True,
fields=(
'articulo', 'cantidad_maxima_vehiculos')
)
ProyectosFormSet = inlineformset_factory(
Anuncio, AnuncioProyectos, extra=0, can_delete=True,
fields=(
'escala',
'actividad',
'tipo_trafico',
'ambito',
'articulo',
'tipo_producto'
)
)
if request.method == 'POST':
next = request.GET.get('next')
form = AnuncioForm(request.POST, request.FILES, instance=anuncio)
# navefoto = NaveFotos(request.POST, request.FILES, instance=navefoto)
# tipo_navefoto = TipoNaveForm(request.POST, request.FILES, instance=tipo_navefoto)
articulosFormSet = ArticulosFormSet(request.POST, instance=anuncio)
proyectosformset = ProyectosFormSet(request.POST, instance=anuncio)
tipo_nave_id = form.data.get('tipo_nave', None)
will_redirect = False
if tipo_nave_id:
tipo_nave_obj = TipoNave.objects.get(id=int(tipo_nave_id))
if tipo_nave_obj.requiere_bodega:
anuncioBodegaFormSet = AnuncioBodegaFormSet(request.POST, instance=anuncio)
if form.is_valid() and articulosFormSet.is_valid() and anuncioBodegaFormSet.is_valid() and \
proyectosformset.is_valid():
if update:
user = request.user
motivo = form.cleaned_data['motivo']
justificacion = form.cleaned_data['justificacion']
HistorialEdicionAnuncios.objects.create(historial_anuncios=anuncio, motivo=motivo,
observacion=justificacion, usuario=user)
anuncio = form.save()
anuncioBodegaFormSet.save()
articulosFormSet.save()
proyectosformset.save()
will_redirect = True
else:
if form.is_valid() and articulosFormSet.is_valid() and proyectosformset.is_valid():
if update:
user = request.user
motivo = form.cleaned_data['motivo']
justificacion = form.cleaned_data['justificacion']
HistorialEdicionAnuncios.objects.create(historial_anuncios=anuncio, motivo=motivo,
observacion=justificacion, usuario=user)
anuncio = form.save()
articulosFormSet.save()
proyectosformset.save()
will_redirect = True
if will_redirect:
if pk == None:
return redirect(anuncio.get_anuncio_codigo())
if next == 'new':
return redirect(reverse('anuncio_create'))
if next == 'self':
return redirect(anuncio.get_anuncio_update_url())
else:
return redirect('anuncio_list')
else:
form = AnuncioForm(instance=anuncio)
anuncioBodegaFormSet = AnuncioBodegaFormSet(instance=anuncio)
articulosFormSet = ArticulosFormSet(instance=anuncio)
proyectosformset = ProyectosFormSet(instance=anuncio)
return render('servicio/anuncio_form.html', locals(), context_instance=ctx(request))
我知道在基于 class 的视图中有一个名为 get_form_kwargs 的函数,您可以在其中放置类似 form_kwargs['update'] = True
的内容,仅此而已。但我正在尝试基于功能的视图,但我不知道该怎么做。我将不胜感激对基于功能的这种观点的任何纠正,我最近一直在学习基于功能的这些观点,因为事实是我是该主题的新手。
Ty.
您将 update
传递给表单的方式与传递任何其他 kwarg 的方式相同,例如:
form = AnuncioForm(request.POST, request.FILES, instance=anuncio, update=True)
如果需要,记得更新 GET 分支。