【问题标题】:Using a SELECT field for a OneToMany field将 SELECT 字段用于 OneToMany 字段
【发布时间】:2013-10-09 00:45:35
【问题描述】:

假设我有以下非常简单的模型:

class Customer(models.Model):
        name = models.CharField(max_length=50)

class Probe(models.Model):
        OwnerInfo = models.CharField(max_length=50)
        comments = models.CharField(max_length=50)
        customer = models.ForeignKey(Customer, null=True, blank=True)

我已经能够将 InLine 添加到 Admin gui,但我想使用一个 SELECT 组件,因此我可以选择几个探针并将它们分配给客户。从这个问题:

one-to-many inline select with django admin

感谢 Luke 的回答(最后一个),我知道我应该创建一个自定义表单并将其分配给我的 ModelAdmin.form,但我不知道如何将它们结合在一起以使其工作。

有人可以帮忙吗?

提前非常感谢。


好的,我更进一步,现在我已将字段添加到表单中,如下所示:

from django.contrib import admin
from django import forms

from web_gui.models import Probe, Customer, Firmware

class CustomerForm(forms.ModelForm):

        probes = forms.ModelMultipleChoiceField(queryset=Probe.objects.all())

        def __init__(self, *args, **kwargs):
                super(CustomerForm, self).__init__(*args, **kwargs)
                self.fields['probes'].initial = [p.pk for p in Probe.objects.filter(customer_id=self.instance.pk)]

        class Meta:
                model = Customer


class CustomerAdmin(admin.ModelAdmin):
        form = CustomerForm

admin.site.register(Probe)
admin.site.register(Customer, CustomerAdmin)
admin.site.register(Firmware)

但没有选择通过“initial”指定的初始值。现在怎么了?我假设接下来将覆盖 save() 方法以在客户上设置探测器,对吗?

【问题讨论】:

  • 所以您想要在客户编辑表单上进行多选输入以进行探测?
  • 就是这样。我今天会处理自定义表单,并让您知道进度。

标签: django django-forms django-admin


【解决方案1】:

这是我想出的最佳解决方案。让我知道是否有其他更好的方法来实现这一点:

from django.contrib import admin
from django import forms
from django.contrib.admin.widgets import FilteredSelectMultiple


from web_gui.models import Probe, Customer, Firmware

class CustomerForm(forms.ModelForm):

        probes = forms.ModelMultipleChoiceField(queryset = Probe.objects.all(), required=False)
        probes.widget = FilteredSelectMultiple("Probes",False,attrs={'rows':'10'})

        def __init__(self, *args, **kwargs):
                super(CustomerForm, self).__init__(*args, **kwargs)

                self.fields['probes'].initial = [p.pk for p in Probe.objects.filter(customer_id=self.instance.pk)]

        def save(self, force_insert=False, force_update=False, commit=True):
                c = super(CustomerForm, self).save(commit=False)
                c.probe_set = self.cleaned_data['probes']
                c.save()

                return c

        class Meta:
                model = Customer


class CustomerAdmin(admin.ModelAdmin):
        form = CustomerForm

admin.site.register(Probe)
admin.site.register(Customer, CustomerAdmin)
admin.site.register(Firmware)

【讨论】:

    猜你喜欢
    • 2012-12-09
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    相关资源
    最近更新 更多