【问题标题】:Django Formset not being processed properlyDjango Formset 未正确处理
【发布时间】:2014-08-31 18:09:15
【问题描述】:

我正在制作一个网络应用程序,用于为校际比赛中的不同活动注册团队。

活动的注册将通过由 Django 表单集组成的网页进行。

我的问题是,虽然表单集的所有元素都显示在网页上,但当我单击其上的“提交”按钮时,根本没有处理相关数据。

此外,如forms.py 中的BaseEventTeamFormset() 中给出的,当event.label 是测验时,表单中应该有一个名为mem3 的第三个文本字段。但是,这第三个字段无法显示在网页上。

我已在此处包含必要的文件。请帮我纠正这个错误。

models.py

from django.db import models
from django.contrib.auth.models import User


class School(models.Model):

    user = models.OneToOneField(User)
    name = models.CharField('Name of school', max_length=30)
    currCap = models.IntegerField('Current Capital')

    def __unicode__(self):
        return self.name


class Event(models.Model):

    EVENTS = (
    ('Quiz', 'Quizzing'),
    ('Design', 'Design'),
    ('Robot', 'Robotics'),
    ('Prog', 'Programming'),
    ('Photo', 'Photography'),
#   ('SurEven', 'Surprise Event'),
)

    memDict = {
    'Quiz': 3,
    'Design': 2,
    'Robot': 2,
    'Prog': 2,
    'Photo': 1,
#   'SurEven': 2,   
}

    name = models.CharField('Name of event', max_length = 20, choices = EVENTS)

    def __unicode__(self):
        return self.name.verbose_name


class EventTeam(models.Model):

    school = models.ForeignKey('School')
    event = models.ForeignKey('Event')

    def __unicode__(self):
        str = self.event + ': ' + self.school.name
        return str


class Member(models.Model):

    name = models.CharField('Name of member', max_length = 20)
    events = models.ManyToManyField('EventTeam')

    def __unicode(self):
        return self.name

forms.py

class EventTeamForm(forms.Form):

    event = forms.BooleanField()
    mem1 = forms.CharField(label="Member 1", max_length = 20)
    mem2 = forms.CharField(label="Member 2", max_length = 20, required = False)

    if event.label == 'Quizzing':
        mem3 = forms.CharField(label="Member 3", max_length = 20, required = False)

class BaseEventTeamFormSet(BaseFormSet):

    def __init__(self, *args, **kwargs):
        super(BaseEventTeamFormSet, self).__init__(*args, **kwargs)

    for i in range(0, len(Event.EVENTS)):
        self[i].fields['event'].label = Event.EVENTS[i][1]


class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ('name', 'descr', 'upForAcq'
    )

views.py

@login_required(login_url = '/xdashboard/login/')
def register(request):

    context = RequestContext(request)
    currSchool = School.objects.get(user = request.user)
    eventTuple = Event.EVENTS
    noOfEvents = len(eventTuple)
    EventTeamFormSet = formset_factory(EventTeamForm, extra = noOfEvents - 1, formset=BaseEventTeamFormSet)

    if request.method == 'POST':
        formset = EventTeamFormSet(request.POST, request.FILES)

        if formset.is_valid():  
            i = 0
            for form in formset:
                participating = form.cleaned_data['event']

                if participating == True:

                    event = Event.objects.get(pk = i+1)

                    mem1 = form.cleaned_data['mem1']
                    mem1 = Member(name = mem1)
                    mem1.save()
                    mem2 = form.cleaned_data['mem2']
                    mem2 = Member(name = mem2)
                    mem2.save()

                    if event == "Quiz":
                        mem3 = form.cleaned_data['mem3']
                        mem3 = Member(name = mem3)
                        mem3.save()

                    # creating database queries, many mistakes!

                    team = EventTeam(school = currSchool, event = event)
                    team.save()
                    mem1.events.add(team) # adding the members to the team
                    mem2.events.add(team)
                    try:
                        mem3.events.add(team)
                    except NameError:
                        pass

                    i += 1

    else:
        formset = EventTeamFormSet()

    context_dict = {
    'formset': formset,
    }

    return render_to_response('xdashboard/register.html', context_dict, context)

【问题讨论】:

  • 请修正代码的空白。表单集肯定有效吗?当 formset.is_valid() 为 False 时,您是否尝试过打印 formset.errors
  • 这里有些空格的格式不正确,但在我的机器上没问题。我将尝试打印formset.errors
  • 您根本没有使用BaseEventTeamFormSet? forms.py 中的if event.label == 'Quizzing': ... 应该在__init__() 方法中。
  • 空格与您的代码相同,这一点很重要。现在看起来更明智了。在我无法分辨else 语句与哪个if 语句一起使用之前。
  • 我很抱歉,阿拉斯代尔。是的,我正在使用它,正如EventTeamFormSet = formset_factory(EventTeamForm, extra = noOfEvents - 1, formset=BaseEventTeamFormSet) in views.py 中给出的那样。

标签: python django forms formset


【解决方案1】:

看起来你的 for 循环在 forms.py 中缺少适当的缩进,需要在 __init__() 方法中。查看您的模板代码会有所帮助。我最好的猜测是您的 formset.is_valid() 方法返回 false 并且您的提交数据处理都不会在 POST 上进行。

为了调试,在您的模板中使用{{ field.errors }}{{ forms.non_field_errors }}

【讨论】:

  • 根据您的建议,我查看了我的模板代码,发现我忘记关闭
    标记。 Grr...非常感谢。
猜你喜欢
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
相关资源
最近更新 更多