首页 > 解决方案 > 基于类的视图中的外键分配

问题描述

基本上我有一个“节点”详细信息页面,我需要从中分配一个新驱动器(对于这个给定的节点 - 它们需要链接)。问题是为 DriveModelForm 链接“节点”,需要在视图中分配。怎么了?所有的细节都在下面。

网址:

urlpatterns = [
    path('<int:pk>/drivecreate/', DriveCreateView.as_view(), name='drive-create')
]

看法:

class DriveCreateView(CreateView):
    template_name = 'create_drive.html'
    form_class = DriveModelForm

    def get_success_url(self):
        return reverse('nodes:node-detail')

    def form_valid(self, form):
        drive = form.save(commit=False)
        drive.node = self.kwargs['pk']
        drive.save()
        return super(DriveCreateView, self).form_valid(form)

模型:

class Drive(models.Model):
    manufacture = models.CharField(max_length=32)
    model = models.CharField(max_length=32)
    drive_type = models.CharField(max_length=32)
    capacity = models.IntegerField(default=0)
    node = models.ForeignKey(Node, on_delete=models.CASCADE)

class Node(models.Model):
    name = models.CharField(max_length=32)
    ... many more ...

形式:

class DriveModelForm(forms.ModelForm):
    class Meta:
        model = Drive
        fields = (
            'manufacture',
            'model',
            'drive_type',
            'capacity',
        )

错误: 无法分配“1”:“Drive.node”必须是“节点”实例。

标签: djangodjango-views

解决方案


视图应稍作调整并引用 Node 并链接到 id。

def form_valid(self, form):
    drive = form.save(commit=False)
    drive.node = **Node.objects.get(id=self.kwargs['pk'])**
    drive.save()
    return super(DriveCreateView, self).form_valid(form)

推荐阅读