Django как показать many2many дополнительных полей в форме?
вот мои models.py:
class EssentialOil(models.Model):
name = models.fields.CharField(max_length=120, verbose_name="Nom")
latin_name = models.fields.CharField(max_length=120, verbose_name="Nom latin")
abbreviation = models.fields.CharField(max_length=8, verbose_name="Abbréviation")
image = models.fields.CharField(default=None, null=True, blank=True, max_length=255, verbose_name="Photo")
administrationmodes = models.ManyToManyField('AdministrationMode', through="EssentialOil_AdministrationMode",
verbose_name="Mode d'administration")
components = models.ManyToManyField('Component', through="EssentialOil_AdministrationMode",
verbose_name="Composants")
warnings = models.ManyToManyField('warning', through="EssentialOil_AdministrationMode",
verbose_name="Points d'attention")
properties = models.ManyToManyField('property', through="EssentialOil_AdministrationMode",
verbose_name="Propriétés")
uses = models.ManyToManyField('use', through="EssentialOil_AdministrationMode",
verbose_name="Utilisations thérapeuthiques")
class Meta:
ordering = ['name']
def __str__(self):
return self.name
class AdministrationMode(models.Model):
mode = models.fields.CharField(max_length=100, verbose_name="Mode")
description = models.fields.CharField(max_length=2000, verbose_name="Description")
warning = models.fields.TextField(max_length=2000, default="Aucun", verbose_name="Point d'attention")
eo = models.ManyToManyField(EssentialOil, through='EssentialOil_AdministrationMode', blank=True,
verbose_name="H.E. concernées")
class Meta:
ordering = ['mode']
def __str__(self):
return self.mode
class EssentialOil_AdministrationMode(models.Model):
class Efficiency(models.IntegerChoices):
RARE = 1
PARFOIS = 2
SOUVENT = 3
IDEAL = 4
eo = models.ForeignKey("EssentialOil", null=True, on_delete=models.CASCADE)
am = models.ForeignKey("AdministrationMode", null=True, on_delete=models.CASCADE)
co = models.ForeignKey("Component", null=True, on_delete=models.CASCADE)
pr = models.ForeignKey("Property", null=True, on_delete=models.CASCADE)
us = models.ForeignKey("Use", null=True, on_delete=models.CASCADE)
wa = models.ForeignKey("Warning", null=True, on_delete=models.CASCADE)
efficiency = models.IntegerField(Efficiency.choices)
class Meta:
unique_together = [['eo', 'am']]
Мой forms.py:
from django import forms
from django.forms import ModelForm
from .models import EssentialOil, AdministrationMode, Component, Warning, Property, Use
class CreateEssentialOil(ModelForm):
class Meta:
model = EssentialOil
fields = "__all__"
administrationmodes = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple,
queryset=AdministrationMode.objects.all(),
label="Mode d'administration")
components = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple,
queryset=Component.objects.all(),
label="Composants")
warnings = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple,
queryset=Warning.objects.all(),
label="Points d'attention")
properties = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple,
queryset=Property.objects.all(),
label="Propriétés")
uses = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple,
queryset=Use.objects.all(),
label="Utilisations thérapeutiques")
Мой views.py :
from django.forms import inlineformset_factory
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render
from .models import EssentialOil, AdministrationMode, Component, Warning, Property, Use, EssentialOil_AdministrationMode
from .forms import CreateEssentialOil, CreateAdministrationMode, \
CreateComponent, CreateWarning, CreateProperty, CreateUse
def create_essentialoil(request):
form = CreateEssentialOil()
if request.method == 'POST':
form = CreateEssentialOil(request.POST)
if form.is_valid():
print(request.POST)
form.save()
return HttpResponseRedirect('/essentialoil/essentialoils')
else:
print(request.POST)
# if a GET (or any other method) we'll create a blank form
else:
form = CreateEssentialOil()
return render(request, 'essentialoil_app/forms/essentialoil_form.html', {'form': form})
Когда я создаю EssentialOil, я хотел бы иметь возможность выбрать несколько AdministrationMode и дать значение эффективности для этого AdministrationMode.
Теперь я могу создать EssentialOil и выбрать AdministrationMode, но я не знаю, как сделать поле "effeciency" видимым в моей форме, как на рисунке ниже. Как я хотел бы видеть его в моей форме
Надеюсь найти здесь помощь. Спасибо за прочтение. JP
Я нашел решение, используя Inlineformset.