Python-Django 无法解释 URL 中的 id 并给出"<built-in function id>"而不是在 rigth 页面上重定向



我有一个用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)

最新更新