【问题标题】:Pass and receive object pk to fix foreign key field in CreateView in Django传递和接收对象 pk 以修复 Django 中 CreateView 中的外键字段
【发布时间】:2021-07-28 11:44:14
【问题描述】:

我正在尝试构建一个 django 应用程序来维护一个名为“Actuacion”的类。根据字段“tipo”的值,需要附加信息,因此我创建了一个带有公共字段的主类“Actuacion”,并为每个“tipo”创建了一个不同的类,每个类型的特定字段与主类链接通过外键“执行”。

模型是这样的:

models.py

class TipoActuacion(models.Model):
    # Values for "tipo" by the moment are "DEPURACION", "CONSERVACION", "PLANEAMIENTO"
    tipo = models.CharField(max_length=50)   
    def __str__(self):
        return self.tipo

class Actuacion(models.Model):
    titulo = models.CharField(max_length=200)
    tipo = models.ForeignKey('TipoActuacion', on_delete=models.SET_NULL, null=True)
    # Other common fields


class ActuacionPlaneamiento(models.Model):
    actuacion = models.ForeignKey('Actuacion', on_delete=models.SET_NULL, null=True)
    info = models.CharField(max_length=100)
    # Other fields

class ActuacionDepuracion(models.Model):
    actuacion = models.ForeignKey('Actuacion', on_delete=models.SET_NULL, null=True)
    habitantes = models.IntegerField(null=True, blank=True)
    # Other fields

class ActuacionConservacion(models.Model):
    actuacion = models.ForeignKey('Actuacion', on_delete=models.SET_NULL, null=True)
    fecha = models.DateField(null=True, blank=True)
    # Other fields

所以,我假装通过基于 django 类的视图创建“Actuacion”对象,并在创建主对象后,根据“tipo”字段上注册的值重定向到相应的创建视图以完成信息。

主类“Actuacion”已创建,但我还没有找到将其与子实体链接的方法(基于字段“tipo”,例如 ActuacionConservacion)。我把创建的Actuacion对象的pk传给kwargs,但是我需要接收这个参数并用它来修复子ActuacionConservacion对象的外键字段。

我被困在这里,任何建议都欢迎

views.py

class ActuacionCreate(CreateView):
    model = Actuacion
    fields = '__all__'
    template_name = 'pgi/actuacion_create.html'
    
    def get_success_url(self):
        servicio = self.object.tipo
        if servicio.__str__() == 'DEPURACION':
            return reverse('actuacion-depuracion-create', kwargs={'pk': self.object.pk})
        elif servicio.__str__() == 'CONSERVACION':
            return reverse('actuacion-conservacion-create', kwargs={'pk': self.object.pk})
        elif servicio.__str__() == 'PLANEAMIENTO':
            return reverse('actuacion-planeamiento-create', kwargs={'pk': self.object.pk})
        else:
            return reverse('actuacion-detail', kwargs={'pk': self.object.pk})


class ActuacionConservacionCreate(CreateView):
    model = ActuacionConservacion
    fields = '__all__'
    template_name = 'pgi/actuacion_tipo_create.html'

urls.py

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^actuaciones/$', views.actuacion_list, name='actuacion-list'),
    url(r'^actuacion/(?P<pk>\d+)/$', views.ActuacionDetailView.as_view(), name='actuacion-detail'),
    url(r'^actuacion/create/$'/, views.ActuacionCreate.as_view(), name='actuacion-create'),
    url(r'^actuacion/create/(?P<pk>\d+)/depuracion/$', views.ActuacionDepuracionCreate.as_view(), name='actuacion-depuracion-create'),
    url(r'^actuacion/create/(?P<pk>\d+)/conservacion/$', views.ActuacionConservacionCreate.as_view(), name='actuacion-conservacion-create'),
    url(r'^actuacion/create/(?P<pk>\d+)/planeamiento/$', views.ActuacionPlaneamientoCreate.as_view(), name='actuacion-planeamiento-create'),
    url(r'^actuacion/(?P<pk>\d+)/update/$', views.ActuacionUpdate.as_view(), name='actuacion-update'),
    url(r'^actuacion/(?P<pk>\d+)/delete/$', views.ActuacionDelete.as_view(), name='actuacion-delete'),
]

【问题讨论】:

    标签: django django-views


    【解决方案1】:

    可能有更好的方法来实现这一点,但我设法链接创建表单并修复覆盖子实体上 form_valid 方法的外键值

    class ActuacionConservacionCreate(CreateView):
        model = ActuacionConservacion
        fields = ['otracosa']
        template_name = 'pgi/actuacion_tipo_create.html'
    
        def form_valid(self, form):
            form.instance.actuacion = Actuacion.objects.get(pk=self.kwargs['pk'])
            return super(ActuacionConservacionCreate, self).form_valid(form)
    

    【讨论】:

      猜你喜欢
      • 2020-03-26
      • 2018-05-02
      • 2015-08-16
      • 2018-09-26
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      相关资源
      最近更新 更多