【问题标题】:apply a filter to the choices field of my model将过滤器应用于我的模型的选择字段
【发布时间】:2022-01-08 19:48:28
【问题描述】:

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

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

【问题讨论】:

  • 所以single_piano 只能在PianoSingleDay 中出现一次?还是我错过了什么?或者PianoSingleDay 可以包含不同日期的single_piano 吗?
  • 计划中可以有多个 PianoSingleDays 对应于选择的星期几。所以一个计划只能有像星期一这样的 1 天
  • 通常情况已经如此:您只能选择一天。问题是:你能选择一天perPiano吗?
  • 问题是我想添加一个新的一天(在不同的页面上,选择一个允许我还选择计划中已经存在的星期一)
  • 所以您不希望day_piano-giorni_settimana 组合重复

标签: django django-models django-views django-forms


【解决方案1】:

您可以让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(
                single_piano=piano
            ).values_list('giorni_settimana', flat=True))
            self.fields['giorni_settimana'].choices = [
                (k, v)
                for k, v in self.fields['giorni_settimana'].choices
                if k not in days
            ]

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

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

@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, piano=piano, 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(piano=piano, prefix='giorno')
    
    context = {'piano': piano, 'giorno_form': giorno_form}
    return render(request, 'crud/create/gestione_piano_single.html', context)

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 2022-01-09
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    相关资源
    最近更新 更多