将过滤器应用于我的模型的选择字段

apply a filter to the choices field of my model

您好,我在使用 django 中的一些过滤器时遇到了问题。 我有自己的观点,我可以在 select 选择字段中选择星期几 一旦选择它就会保存在数据库中。 我想过滤那些已经存在的,以免在我不得不选择另一天时重复它们。 谁能帮帮我吗?

models.py

class Piano(models.Model):
  nome_piano = models.CharField(max_length=100)
  data_inizio = models.DateField()
  data_fine = models.DateField()
  utente_piano = models.ForeignKey(
    User, 
    on_delete = models.CASCADE,
    related_name = 'utente_piano'
  )
  
  def __str__(self):
    return self.nome_piano

  class Meta:
    verbose_name = "Piano alimentare"
    verbose_name_plural = "Piani alimentari"

class PianoSingleDay(models.Model):
    giorni_settimana_scelta = [
        ("1","Lunedì"),
        ("2","Martedì"),
        ("3","Mercoledì"),
        ("4","Giovedì"),
        ("5","Venerdì"),
        ("6","Sabato"),
        ("7","Domenica")
    ]
    giorni_settimana = models.CharField(
        choices = giorni_settimana_scelta,
        max_length = 300
    )
    single_piano = models.ForeignKey(
        Piano,
        on_delete = models.CASCADE, 
        related_name = 'single_piano'
    )

    def __str__(self):
        return self.giorni_settimana
  
    class Meta:
        verbose_name = "Piano singolo"
        verbose_name_plural = "Piani singoli"

views.py

@login_required
def PianoSingleView(request, id):
    piano = get_object_or_404(models.Piano, id = id, utente_piano = request.user)

    if request.method == 'POST':
        giorno_form = PianoSingleDayForm(request.POST, prefix = 'giorno')
        if giorno_form.is_valid():
            day_piano = giorno_form.save(commit = False)
            day_piano.single_piano = piano
            day_piano.save()

            return redirect('gestione-piano', id = piano.id)

    else:
        giorno_form = PianoSingleDayForm(prefix = 'giorno')

    context = {'piano': piano, 'giorno_form': giorno_form}
    return render(request, 'crud/create/gestione_piano_single.html', context)

forms.py

class PianoSingleDayForm(forms.ModelForm):

    class Meta:
        model = models.PianoSingleDay
        exclude = ['single_piano']

1

2

您可以让 PianoSingleDayForm 排除已经为 Piano 选择的日期:

class PianoSingleDayForm(forms.ModelForm):
    def __init__(self, *args, piano=None, **kwargs):
        super().__init__(*args, **kwargs)
        if piano is not None:
            days = set(PianoDaySingle.objects.filter(
                <strong>single_piano=piano</strong>
            ).values_list('giorni_settimana', flat=True))
            self.fields['giorni_settimana'].choices = [
                (k, v)
                for k, v in self.fields['giorni_settimana'].choices
                if <strong>k not in days</strong>
            ]

    class Meta:
        model = models.PianoSingleDay
        exclude = ['single_piano']

然后我们可以通过将 Piano 对象传递给 GET 和 POST 代码路径中的表单来在视图中使用它:

@login_required
def PianoSingleView(request, id):
    piano = get_object_or_404(models.Piano, id=id, utente_piano=request.user)
    if request.method == 'POST':
        giorno_form = PianoSingleDayForm(request.POST<strong>, piano=piano</strong>, prefix='giorno')
        if giorno_form.is_valid():
            giorno_form.instance.single_piano = piano
            giorno_form.save()
            return redirect('gestione-piano', id=piano.id)
    else:
        giorno_form = PianoSingleDayForm(<strong>piano=piano</strong>, prefix='giorno')
    
    context = {'piano': piano, 'giorno_form': giorno_form}
    return render(request, 'crud/create/gestione_piano_single.html', context)