私は中間テーブルを設定するためにスルーを使用してm2m関係を扱っています。問題は、通常のドロップダウンではなく複数選択を表示する必要があることですが、複数のアイテムを選択して保存するとエラーが発生します。
ValueError: Cannot assign "<QuerySet [<Facility: facility1>, <Facility: facility2>]>": "Property.facility" must be a "Facility" instance.
また、このモデルを admin.TabularInline に表示しています。これにより、表形式のインラインでは複数のフォームを挿入できるため、行ごとに 1 つの項目のみを選択できます。
カスタム保存などの複数のソリューションと、それを保存できるようにする方法をいくつか試しましたが、問題が表示されます。この選択を実行するには、複数選択ウィジェットでフォームを 1 つだけ表示する必要があります。
models.py
class Facility(models.Model):
name = models.CharField(max_length=200)
class Property(models.Model):
name = models.CharField(max_length=200)
area = models.CharField(max_length=200)
facility = models.ManyToManyField(Facility, through="PropertyFacility")
class PropertyFacility(models.Model):
prop = models.ForeignKey(
Property, related_name="facilities", on_delete=models.CASCADE
)
facility = models.ForeignKey(
Facility, related_name="properties", on_delete=models.CASCADE
)
admin.py
from django.contrib.admin.widgets import FilteredSelectMultiple
from django.utils.translation import ugettext_lazy as _
class PropertyFacilityForm(forms.ModelForm):
facility = forms.ModelMultipleChoiceField(Facility.objects.all(), required=True, widget=FilteredSelectMultiple(_('ss'), False, attrs={'rows':'10'})
class PropertyFacilityInline(admin.TabularInline):
model = Property.facility.through
form = PropertyFacilityForm
class PropertyAdmin(TabbedModelAdmin):
model = Property
tab_facilities = (PropertyFacilityInline,)
tab_property = (
(
"Property Details",
{
"fields": (
"name",
"area",
)
},
),
)
tabs = [
("Property", tab_property),
("Facilities", tab_facilities),
]
このように管理者に表示させてくれました ここでは、複数の選択を選択できることがわかりますが、フォームは複数ではなく1つにする必要があります。
複数選択して保存できる複数選択ウィジェットを使用して単一のフォームを 1 つだけ表示したいのですが、change_view では、選択されたものと選択されていないものが表示されます。