如何在 Django 中以相同的 POST 形式从多个下拉列表中获取多个值

How to take multiple value from multiple drop downs in the same POST form in Django

您好,我正在 Django 中创建电影图书系统,用户必须从两个下拉菜单中 select 一部电影及其 date/time。我的问题是它只拍摄电影而不是 date/time。我想知道如何以相同的形式添加这两个。 谢谢

html 文件:

<form action="/booking" method="post">
    {% csrf_token %}
    <div class="movie-container">
        <label>Pick a film:</label>
        <select name="selectedFilm">
    {% for showing in showings %}
    <option value="{{ showing.film }}" name="film">{{ showing.film }}</option>
    {% endfor %}
  </select>
        <br>
        <br>
        <label>Pick a time:</label>
        <select id="selectedDate">
    {% for showing in showings %}
    <option value="{{ showing.date_time }}" name="date">{{ showing.date_time }}</option>
    {% endfor %}
  </select>
        <br>
        <div class="btn-layer">
            <input type="submit" value="Select">
        </div>
    </div>
</form>

表单文件

class SelectedFilmForm(forms.Form):
   selectedFilm = forms.CharField(required=True)
   selectedDate = forms.DateTimeField(required=True, input_formats=["%Y-%m-%dT%H:%M", ])
enter code here

模型文件

class Film(models.Model):

   name = models.CharField(verbose_name='Film name', max_length=30)
   age_rating = models.CharField(verbose_name='Age rating', max_length=5, choices=AgeRatings, default='U')
   duration = models.DecimalField(verbose_name='Duration (minutes)', max_digits=4, decimal_places=1, blank=True, null=True)
   description = models.CharField(verbose_name='Description', max_length=500, blank=True, null=True)
   image = models.ImageField(upload_to='films',default='null')

   def __str__(self):
       return self.nameclass 
Screen(models.Model):

   screen_id = models.CharField(verbose_name='Screen ID', max_length=30)
   capacity = models.IntegerField(verbose_name='Capacity')
   
   def __str__(self):
       return self.screen_id

class Showing(models.Model):

   film = models.ForeignKey(Film, on_delete=models.CASCADE, verbose_name='Film', blank=True, null=True)
   date_time = models.DateTimeField()
   screen = models.ForeignKey(Screen, on_delete=models.CASCADE, verbose_name='Screen', blank=True, null=True)
   def __str__(self):
       return self.film.name

和我的观点文件

def booking(request):
if request.method == "POST":
    form = SelectedFilmForm(request.POST)
    d = request.POST.get('selectedDate')
    f = request.POST.get('selectedFilm')

    print("Here", f)
    print("Here", d)
    if form.is_valid():
        print(form.errors)
        f = form.cleaned_data['selectedFilm']
        d = form.cleaned_data['selectedDate']
        print("Here", f)
        print("Here", d)
        # genderselect = form.cleaned_data['genderselect']
        # request.session["genderselect"] = request.POST['genderselect']
        request.session["selectedFilm"] = request.POST['selectedFilm']
        request.session["selectedDate"] = request.POST['selectedDate']

else:
    form = SelectedFilmForm()

film = request.session.get('selectedFilm')
date = request.session.get('selectedDate')
print("Here", film)
print("Here", date)

return render(request, "booking.html", {'film': film})

您还没有为 selectedDate 下拉菜单命名。请注意,您的电影下拉菜单具有名称属性并且有效。尝试

<select id="selectedDate" name="selectedDate">

这将使您的视图能够拉取选择。

此外,最好删除选项中的名称属性:

<option value="{{ showing.film }}" name="film"

它不是一个适合选项的属性,可能会造成混淆。