我对Django来说相对较新。我目前正在为一个小型学生协会(大约100人)建立一个网站,并试图在我的网站上制作一个活动应用程序,以便管理员可以创建用户可以选择参加的活动。我已成功创建模型并使用ListView和DetailView,以便用户可以查看哪些事件可用。
我在活动详情页面上制作按钮时遇到问题,以便用户只需点击按钮就可以说明他们是否参加了活动。我目前只能通过管理站点执行此操作,但我希望用户自己注册。
据我所知,我需要使用某种形式,但我不确定最好这样做。这听起来很简单,但尽管在网上搜索了几天,我还是无法弄明白。正如我所说,我是Django的新手。
我有两个模型,一个用于事件,一个用于注册,它们将用户链接到事件,并提供有关用户注册时间的信息。
以下是我的文件:
Models.py
import datetime
from django.db import models
from django.contrib.auth.models import User
from django.core.urlresolvers import reverse
class Event(models.Model):
title = models.CharField('Title', max_length=140)
location = models.CharField('location', max_length=150)
info = models.TextField()
starts = models.DateTimeField('Starts')
ends = models.DateTimeField('Ends')
arrive_when = models.DateTimeField('Arrival time', null = True, blank = True)
arrive_where = models.CharField('Arrival location', null = True, max_length = 150, blank = True)
registration_starts = models.DateTimeField('Registration start')
registration_limit = models.IntegerField('Guest limit',
default=0,
choices=[(0, u"No limit")] + list(zip(range(1,100), range(1,100))))
class Meta:
verbose_name = "event"
verbose_name_plural = "events"
ordering = ['-starts']
def __str__(self):
if self.starts.date() != self.ends.date():
return u"%s, %s - %s" % (self.title,
self.starts.strftime("%a %H:%M"),
self.ends.strftime("%a %H:%M"))
else:
return u"%s, %s - %s" % (self.title,
self.starts.strftime("%H:%M"),
self.ends.strftime("%H:%M"))
def get_registrations(self):
return EventRegistration.objects.filter(event = self)
class EventRegistration(models.Model):
event = models.ForeignKey(Event,verbose_name='Event')
user = models.ForeignKey(User,verbose_name='Attendee')
time_registered = models.DateTimeField()
def __str__(self):
return self.user.username
class Meta:
verbose_name = 'Attendee for event'
verbose_name_plural = 'Attendees for events'
ordering = ['time_registered', ]
unique_together = ('event', 'user')
def save(self, *args, **kwargs):
if self.id is None and self.time_registered is None:
self.time_registered = datetime.datetime.now()
super(EventRegistration, self).save(*args, **kwargs)
views.py
from django.shortcuts import render, redirect
from django.views import generic
from django.views.generic.edit import CreateView, UpdateView, DeleteView
import datetime
from .models import Event, EventRegistration
# Create your views here.
class IndexView(generic.ListView):
template_name = 'events/index.html'
context_object_name = 'event_list'
def get_queryset(self):
return Event.objects.all()
class DetailView(generic.DetailView):
model = Event
template_name = 'events/detail.html'
urls.py
from django.conf.urls import url, include
from . import views
app_name = 'events'
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^(?P<pk>\d+)/$', views.DetailView.as_view(), name='detail' ),
]
有人可以帮我按一下按钮,以便人们可以报名参加活动吗?
答案 0 :(得分:0)
我通过在Event类中定义一个函数来解决这个问题,该函数用于向EventRegistration表添加数据,并使用视图来调用该函数。
如果有人遇到类似的问题,我会把它留在这里。
编辑:这是我的解决方案
在views.py
我添加了这个:
def event_add_attendance(request, pk):
this_event = Event.objects.get(pk=pk)
this_event.add_user_to_list_of_attendees(user=request.user)
return redirect('events:detail', pk=pk)
def event_cancel_attendance(request, pk):
this_event = Event.objects.get(pk=pk)
this_event.remove_user_from_list_of_attendees(request.user)
return redirect('events:detail', pk=pk)
在models.py
我添加了这个:
def add_user_to_list_of_attendees(self, user):
registration = EventRegistration.objects.create(user = user,
event = self,
time_registered = timezone.now())
def remove_user_from_list_of_attendees(self, user):
registration = EventRegistration.objects.get(user = user, event = self)
registration.delete()
然后在urls.py
我添加了两个视图,一个链接到event_add_attendance
视图,另一个链接到event_cancel_attendance
视图。它们都会重定向到事件的详细信息页面,就在我找到按钮的同一页面上。
警告:此代码由Django + Python业余爱好者编写。有一些需要修补的错误,我会在有空的时候修复这些错误。例如,如果有匿名用户(未登录)访问重定向到事件提交视图的链接,他就可以将自己(作为匿名用户)添加到事件出席列表中。这应该是一个简单的解决方案,但我还没有解决它。希望这有助于那里的人!