【问题标题】:Django Modelform doesn't accept selection on POSTDjango Modelform 不接受 POST 上的选择
【发布时间】:2018-08-01 02:28:00
【问题描述】:

下拉列表在 html 中正确显示,但是我无法弄清楚为什么我在尝试提交 / 时一次又一次遇到相同的错误。

“选择一个有效的选项。该选项不是可用选项之一。”

问题背景

我在 Django 中定义了两个模型。一个 CourseModel 数据库保存所有提供的课程,一个注册数据库将课程链接到用户。

models.py

from django.db import models
# Create your models here.

class CourseModel(models.Model):
    course = models.CharField(max_length=100)
    date = models.DateField(max_length=100)
    time = models.TimeField()
    location = models.CharField(max_length=100)
    datetime = models.DateTimeField()

class RegistrationModel(models.Model):
    name = models.CharField(max_length=100)
    adress = models.CharField(max_length=100)
    city = models.CharField(max_length=100)
    email = models.EmailField(max_length=100)
    course = models.ForeignKey('self', on_delete=models.CASCADE)

    def __str__(self):
        return self.name

我使用 modelForm 创建一个注册表单,用户可以在其中从下拉列表中订阅课程。

forms.py

from django.forms import ModelForm, RegexField
from home.models import RegistrationModel, CourseModel
from django import forms
import datetime


class RegistrationForm(ModelForm):

    def __init__(self, *args, **kwargs):
        super(RegistrationForm, self).__init__(*args, **kwargs)
        self.fields['course'].queryset = CourseModel.objects.exclude(date__lt=datetime.datetime.today()).values_list('datetime', flat=True)
        self.fields['course'].empty_label = None


    class Meta:
        model = RegistrationModel
        fields = '__all__'

views.py

from django.shortcuts import render, redirect
from home.forms import RegistrationForm
from .models import CourseModel
import datetime

def home(request):
    return render(request, 'home/home.html')


def registration(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        crs = request.POST.get('course')
        print(crs)
        if form.is_valid():
            cleanform = form.save(commit=False)
            cleanform.course = crs
            cleanform.save()
            return redirect('home')
    else:
        form = RegistrationForm()
    return render(request, 'home/registration.html', {'form': form})

【问题讨论】:

    标签: python django


    【解决方案1】:

    RegistrationForm__init__() 方法中,您的self.fields['course'].queryset = ...values_list('datetime', flat=True) 返回datetime 实例。见values_list() docs

    我相信这可能会导致问题。我猜queryset 应该返回CourseModel 实例,基于Django docs

    ForeignKey 由 django.forms.ModelChoiceField 表示,这是一个 ChoiceField,其选择是一个模型 QuerySet。

    此外,您的RegistrationModel.course 字段具有'self' 的外键,而不是CourseModel。不确定这是否是您想要的。

    设置字段查询集的其他示例可以找到here

    【讨论】:

      猜你喜欢
      • 2021-08-03
      • 1970-01-01
      • 2018-11-23
      • 2015-09-24
      • 2015-08-11
      • 2016-12-07
      • 2012-01-31
      • 2011-04-02
      • 2011-09-26
      相关资源
      最近更新 更多