我有一个用Django 1.8构建的简单应用程序,它可以创建事件并向其中添加参与者。我和蟒蛇一起玩虚拟游戏。创建活动时,我会重定向到此活动的详细信息页面,现在我可以添加一些与会者。但是当我添加一个时,django无法将我重定向到事件的页面,因为它无法解释id并给我<built-in function id>
。
我的应用程序事件:
型号.py
class Event(models.Model):
name = models.CharField("Event title", max_length=255)
organizer = models.ForeignKey(User)
attendees = models.ManyToManyField(User, verbose_name="Attendees", blank=True,
through="EventAttendees", related_name="%(app_label)s_%(class)s_attendees")
def get_absolute_url(self):
return reverse('event:detail', kwargs={'pk':self.pk})
def delete_url(self):
return reverse('event:delete', kwargs={'pk':self.pk})
def update_url(self):
return reverse('event:update', kwargs={'pk':self.pk})
def __str__(self):
return self.name
class Meta:
verbose_name = 'Event'
verbose_name_plural = 'Events'
class EventAttendees(models.Model):
event = models.ForeignKey(Event)
attendee = models.ForeignKey(User)
def delete_url(self):
return "/event/%i/attendee/%i/delete/" % (self.event.id, self.attendee.id)
class Meta:
unique_together = (
'event',
'attendee',
)
forms.py
class EventForm(ModelForm):
class Meta:
model = Event
fields = ('name',)
class EventAttendeesForm(ModelForm):
class Meta:
model = EventAttendees
fields = ('event', 'attendee',)
def __init__(self, *args, **kwargs):
super(EventAttendeesForm, self).__init__(*args, **kwargs)
self.fields['event'].widget = HiddenInput()
if 'event' in self.initial:
attendees = [user.pk for user in self.initial['event'].attendees.all()]
self.fields['attendee'].queryset=User.objects.exclude(pk__in = attendees)
视图.py
class EventCreateView(CreateView):
model = Event
form_class = EventForm
template_name = 'evenement/event/create.html'
def form_valid(self, form):
obj = form.save(commit=False)
o = User.objects.get(username=self.request.user)
obj.organizer = o
obj.save()
return HttpResponseRedirect(obj.get_absolute_url())
def delete_attendee(request, event_id, attendee_id):
if request.method == 'POST':
event = Event.objects.get(pk = event_id)
attendee = User.objects.get(pk = attendee_id)
to_be_deleted = EventAttendees.objects.get(
event = event,
attendee = attendee)
to_be_deleted.delete()
if request.is_ajax():
return HttpResponse("Ok")
return HttpResponseRedirect('/event/%s/detail/' % event_id)
class EventDetailView(DetailView):
model = Event
template_name = 'evenement/event/details.html'
def get_context_data(self, **kwargs):
context = super(EventDetailView, self).get_context_data(**kwargs)
form = EventAttendeesForm(initial = {'event':self.object})
attendees = [user.pk for user in self.object.attendees.all()]
form.fields['attendee'].queryset = User.objects.exclude(pk__in = attendees)
form.fields['event'].widget = HiddenInput()
context['form'] = form
return context
def post(self, request, *args, **kwargs):
form = EventAttendeesForm(self.request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect('/event/%s/detail/' %id)
else:
return render(request, 'evenement/event/details.html', {'event': form.instance.event, 'form': form})
我认为问题位于EventDetailView类的功能帖子中,这里是
return HttpResponseRedirect('/event/%s/detail/' %id)
Python无法解释%id
我想加入这个应用程序,但我不知道该怎么做。非常感谢你的回答。
您必须实际获取项目的id,而您并没有这样做。
if form.is_valid():
obj = form.save()
return HttpResponseRedirect('/event/%s/detail/' % obj.id)