Django - 参加活动的按钮?

时间:2017-08-15 22:33:53

标签: python django django-models django-forms django-views

我对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' ),
]

有人可以帮我按一下按钮,以便人们可以报名参加活动吗?

1 个答案:

答案 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业余爱好者编写。有一些需要修补的错误,我会在有空的时候修复这些错误。例如,如果有匿名用户(未登录)访问重定向到事件提交视图的链接,他就可以将自己(作为匿名用户)添加到事件出席列表中。这应该是一个简单的解决方案,但我还没有解决它。希望这有助于那里的人!