学校間の大会でさまざまなイベントにチームを登録するためのWebアプリケーションを作成しています。
イベントへの登録は、Djangoフォームセットで構成されるWebページを介して行われます。
私の問題は、フォームセットのすべての要素がWebページに表示されていても、[送信]ボタンをクリックしても、関連するデータがまったく処理されないことです。
また、で与えられるようBaseEventTeamFormset()
にforms.py
、と呼ばれる第三のテキストフィールドがあるはずmem3
際、フォームでevent.label
クイズです。ただし、この3番目のフィールドはWebページに表示されません。
ここに必要なファイルを含めました。このエラーを修正するのを手伝ってください。
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)
forループにはforms.pyに適切なインデントがなく、__init__()
メソッド内にある必要があるようです。テンプレートコードを確認すると便利です。私の推測では、formset.is_valid()
メソッドはfalseを返し、送信時のデータ処理はPOSTでは行われません。
酒の使用をデバッグするため{{ field.errors }}
や{{ forms.non_field_errors }}
、テンプレートインチ
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加