【问题标题】:Convert QuerySet into List in Django for ModelMultipleChoiceField在 Django 中为 ModelMultipleChoiceField 将 QuerySet 转换为 List
【发布时间】:2021-10-15 02:54:38
【问题描述】:
TIMESLOT_LIST = (
        (5, '09:00 – 09:30'),
        (9, '09:30 – 10:00'),
        (2, '10:00 – 10:30'),
    )
    
class AvailabilitiesForm(forms.Form):
    time_slot = forms.ModelMultipleChoiceField(queryset = None, widget=forms.CheckboxSelectMultiple)

    def __init__(self, *args, **kwargs):
        date = kwargs.pop('date')
        super(AvailabilitiesForm, self).__init__(*args, **kwargs)
        #choices = getChoices(letter)
        self.fields['time_slot'].queryset = Appointment.objects.filter(date = date).values_list('time_slot', flat = True)

观点:

@login_required
def chooseAvailabilities(request):
    date_7 = (datetime.date.today() + datetime.timedelta(days=7)).strftime("%Y-%m-%d")
    appointment_7 = Appointment.objects.filter(date = date_7).all()

return render(request, 'panel/choose_availabilities.html', {'tomorrow' : appointment_7})

models.py

class Appointment(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, null = True, on_delete = models.CASCADE)
    student = models.ForeignKey(Student, null=True, blank = True, on_delete=models.CASCADE)
    date = models.DateField(null = True)
    time_slot = models.IntegerField(default = 0, choices= TIMESLOT_LIST)

这显示:

我想要:

如何使用 TIMESLOT_LIST 显示字符串“9h00 - 9h30”而不是 5?

通过的时候,怎么才能撤回项目符号呢?

【问题讨论】:

  • 谢谢。它没有回答我的问题,因为我的 Form 类没有覆盖 ModelForm 类,在该类中我可以将对象用于 label_from_instance 函数。在我的 Form 类中,我只得到一个查询集而不是对象。我可以将 label_from_instance 用于查询集而不是对象吗?

标签: python django forms model


【解决方案1】:

您可以执行以下操作:-

from django.utils.translation import gettext_lazy as _

class Appointment(models.Model):

    class TimeSlot(models.TextChoices):
        FIRST_T = '5', _('9:00 - 09:30')
        SECOND_T = '9', _('09:30 - 10:00')
        THIRD_T = '2', _('10:00 - 10:30')

    time_slot = models.CharField(max_length=1,choices=TimeSlot.choices,default=TimeSlot.FIRST_T)


class AvailabilitiesForm(forms.Form):
    time_slot = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple)

    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        d1 = kwargs.pop('date')
        ava_time = []

        for i in Appointment.objects.filter(date=d1):
            for x in Appointment.TimeSlot.choices:
                if x[0] == i.time_slot:
                    ava_time.append(x)

        self.fields['time_slot'].choices = ava_time

【讨论】:

  • 我在表格中给出的 kwargs 日期呢?
  • 能否请您成为您的约会模型,因为到目前为止我还不清楚日期和时间段是如何关联的。从你的问题我认为唯一的问题是显示和项目符号。
  • 我添加了它。在我看来,我给表格一个我希望显示小时数的日期。
  • 对日期进行了必要的更改。请检查。
  • 谢谢,对我帮助很大。您只需在 Form 中像这样反转: class AvailabilitiesForm(forms.Form): time_slot = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple) def __init__(self,*args,**kwargs): date = kwargs.pop( 'date') super().__init__(*args,**kwargs) ava_value_timeslots = ((key, val) for key, val in dict(Appointment.TimeSlot.choices).items() if int(key) 不在列表中(Appointment.objects.filter(date = date).values_list('time_slot', flat = True))) self.fields['time_slot'].choices = ava_value_timeslots
猜你喜欢
  • 1970-01-01
  • 2012-07-26
  • 2013-05-25
  • 1970-01-01
  • 2013-09-07
  • 2011-05-24
  • 2012-03-08
  • 2018-01-22
  • 2019-04-03
相关资源
最近更新 更多