从 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 分支。