【发布时间】:2021-12-19 03:09:44
【问题描述】:
我正在构建一个 Django 应用程序,但遇到了一个我不知道如何解决的问题...我会尽量解释清楚。
我有一个名为“Impostazioni”的应用程序,它有一个名为“AnniScolastici”的模型:
class AnniScolastici(models.Model):
nome = models.CharField(max_length=50)
class Meta:
verbose_name = "Anno scolastico"
verbose_name_plural = "Anni scolastici"
def __str__(self):
return f"{self.nome}"
我还有另一个名为“Attivita”的应用程序,它有一个名为“Laboratori”的模型:
class Laboratori(models.Model):
nome = models.CharField(max_length=25)
durata = models.IntegerField(default=0)
anniscolastici = models.ManyToManyField(AnniScolastici)
note = models.TextField(null=True, blank=True)
class Meta:
verbose_name = "Laboratorio"
verbose_name_plural = "Laboratori"
def __str__(self):
return f"{self.nome}"
我编写了另一个名为“RichiesteLaboratori”的模型,它与我的 Django 应用程序中的不同模型相关(当然还有上面的两个模型):
class RichiesteLaboratori(models.Model):
date_added = models.DateTimeField(auto_now_add=True)
date_valid = models.DateTimeField(null=True, blank=True)
provincia = models.ForeignKey("impostazioni.Province", related_name="richiesta_provincia", null=True, on_delete=models.CASCADE)
istituto = models.ForeignKey("contatti.Istituto", related_name="richiesta_istituto", null=True, on_delete=models.CASCADE)
plesso = models.ForeignKey("contatti.Plesso", related_name="richiesta_plesso", null=True, on_delete=models.CASCADE)
classe = models.CharField(max_length=25)
numero_studenti = models.PositiveIntegerField()
nome_referente = models.CharField(max_length=50)
cognome_referente = models.CharField(max_length=50)
email = models.EmailField()
telefono = models.CharField(max_length=20)
termini_servizio = models.BooleanField()
classi_attivita = models.ManyToManyField(AnniScolastici, related_name="richiesta_anniScolastici")
laboratori = models.ManyToManyField(Laboratori)
note = models.TextField(null=True, blank=True)
approvato = models.BooleanField(default=False)
class Meta:
verbose_name = "Richiesta - Laboratorio"
verbose_name_plural = "Richieste - Laboratorio"
def __str__(self):
return f"{self.pk}"
我正在通过 ModelForm 和视图填充此模型的条目。这是表格:
class RichiesteLaboratoriModelForm(forms.ModelForm):
classi_attivita = forms.ModelMultipleChoiceField(
queryset=AnniScolastici.objects.all(),
widget=forms.CheckboxSelectMultiple,
required=True
)
laboratori = forms.ModelMultipleChoiceField(
queryset=Laboratori.objects.all(),
widget=forms.CheckboxSelectMultiple,
required=True
)
termini_servizio = forms.BooleanField(
label = "Conferma di voler aderire al progetto con la classe indicata e di impegnarsi a rispettare le regole previste",
required=True
)
class Meta:
model = RichiesteLaboratori
fields = (
'provincia',
'istituto',
'plesso',
'classe',
'numero_studenti',
'nome_referente',
'cognome_referente',
'email',
'telefono',
'classi_attivita',
'laboratori',
'note',
'termini_servizio'
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['istituto'].queryset = Istituto.objects.none()
self.fields['plesso'].queryset = Plesso.objects.none()
if 'provincia' in self.data:
try:
id_provincia = int(self.data.get('provincia'))
self.fields['istituto'].queryset = Istituto.objects.filter(provincia=id_provincia).order_by('nome')
except (ValueError, TypeError):
pass
elif self.instance.pk:
self.fields['istituto'].queryset = self.instance.provincia.istituto_set.order_by('nome')
if 'istituto' in self.data:
try:
id_istituto = int(self.data.get('istituto'))
self.fields['plesso'].queryset = Plesso.objects.filter(istituto=id_istituto).order_by('nome')
except (ValueError, TypeError):
pass
elif self.instance.pk:
self.fields['plesso'].queryset = self.instance.istituto.plesso_set.order_by('nome')
这是视图:
class RichiestaLaboratorioCreateView(LoginRequiredMixin, generic.CreateView):
template_name = "richiestalaboratorio/richiestalaboratorio_crea.html"
form_class = RichiesteLaboratoriModelForm
def get_success_url(self):
return reverse("operativita:richiestalaboratorio-lista")
视图引用了一个名为“richiestalaboratorio_crea.html”的模板,用于呈现表单。代码如下:
{% extends "base.html" %}
{% load crispy_forms_tags %}
{% block title %}
Nuova richiesta laboratorio
{% endblock title %}
{% block js-head %}
<!-- Select2 -->
<script>
$(document).ready(function() {
$('#id_provincia').select2({
placeholder: "Seleziona una provincia...",
allowClear: true,
language: {
noResults: function() {
return 'Nessuna provincia trovata';
},
}
});
$('#id_grado').select2({
placeholder: "Seleziona un grado...",
allowClear: true,
language: {
noResults: function() {
return 'Nessun grado trovato';
},
}
});
$('#id_istituto').select2({
placeholder: "Seleziona un istituto...",
allowClear: true,
language: {
noResults: function() {
return 'Nessun istituto trovato';
},
}
});
$('#id_plesso').select2({
placeholder: "Seleziona un plesso...",
allowClear: true,
language: {
noResults: function() {
return 'Nessun plesso trovato';
},
}
});
});
</script>
{% endblock js-head %}
{% block content %}
<div class="container">
<div class="row border-bottom border-1">
<div class="col-12 pb-2">
<a href="{% url 'operativita:richiestalaboratorio-lista' %}">Torna alle richieste di laboratorio</a>
</div>
</div>
<div class="row mt-3">
<div class="col-12">
<h1>Aggiungi una richiesta di laboratorio</h1>
<p class="text-secondary">Compila il form per aggiungere una richiesta di laboratorio.</p>
</div>
</div>
<div class="row mt-3 mb-5">
<div class="col-12">
<form method="post" id="richiestaLaboratorioForm" data-istituti-url="{% url 'operativita:ajax_carica_istituti' %}" data-plessi-url="{% url 'operativita:ajax_carica_plessi' %}">
{% csrf_token %}
{{ form|crispy }}
<button type='submit' class="btn btn-primary mt-3">Aggiungi</button>
</form>
</div>
</div>
</div>
{% endblock content %}
{% block js-footer %}
<!-- Dynamic filtering -->
<script>
$("#id_provincia").change(function () {
var url = $("#richiestaLaboratorioForm").attr("data-istituti-url");
var id_provincia = $(this).val();
$.ajax({
url: url,
data: {
'provincia': id_provincia
},
success: function (data) {
$("#id_istituto").html(data);
}
});
});
$("#id_istituto").change(function () {
var url = $("#richiestaLaboratorioForm").attr("data-plessi-url");
var id_istituto = $(this).val();
$.ajax({
url: url,
data: {
'istituto': id_istituto
},
success: function (data) {
$("#id_plesso").html(data);
}
});
});
</script>
{% endblock js-footer %}
实际结果是这样的:
现在,我应该做的是在模型表单中嵌套 ManyToMany 选择。事实上,每个“Laboratori”都与特定的“AnniScolastici”相关联。我想向用户显示一个“AnniScolastici”条目的复选框,然后显示与之关联的所有“Laboratori”条目。
最终结果应该是这样的:
我正在尝试解决这个问题,但我找不到解决方案...请您帮帮我吗?
感谢您的宝贵时间!
【问题讨论】:
-
AnniScolastici 之前的复选框应该做什么?检查所有相关实验室?
-
@yagus 该复选框应该检查每个 Anni Scolastici 中的所有 Laboratori。我会放置一个函数,其中每个 Anni Scolastici 的关联实验室仅在选择相关 Anni Scolastici 时才会显示
标签: python python-3.x django django-forms django-templates