首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将筛选器应用于模型的“选择”字段

将筛选器应用于模型的“选择”字段
EN

Stack Overflow用户
提问于 2022-01-08 19:48:28
回答 1查看 56关注 0票数 1

嗨,我在django的一些过滤器上有问题。我有自己的观点,我可以选择星期的日期,这是一个选择的选择字段,一旦选择,它将保存在数据库中。我想过滤那些已经出席,以便不再重复,如果我必须选择新的一天。有人能帮帮我吗?

models.py

代码语言:javascript
复制
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

代码语言:javascript
复制
@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

代码语言:javascript
复制
class PianoSingleDayForm(forms.ModelForm):

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

1

2

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-08 20:16:00

您可以让PianoSingleDayForm排除已经为该Piano选择的天数:

代码语言:javascript
复制
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']

然后,通过将Piano对象传递给GET和POST代码页中的表单,我们可以在视图中使用这一点:

代码语言:javascript
复制
@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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70635865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档