【发布时间】: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)inviews.py中给出的那样。
标签: python django forms formset