我对Django比较陌生。 我目前正在为一个小型学生协会(约100人)建立一个网站,并试图在我的网站上制作一个活动应用,以便管理员可以创建活动,用户可以选择参加。 我已经成功创建了模型,并使用了ListView和DetailView,以便用户可以查看可用的事件。

我在活动详细信息页面上制作按钮时遇到问题,以便用户单击按钮即可说出自己是否正在参加活动。 目前,我只能通过管理网站来执行此操作,但我希望用户自行注册。

据我了解,我需要使用某种形式的表格,但是我不确定这样做的最佳方式。 听起来很简单,但是尽管在网上搜索了几天,但我仍无法弄清楚。 正如我所说,我是Django的新手。

我有两种模型,一种用于事件,一种用于注册,它将用户链接到事件,并提供有关用户何时注册的信息。

这是我的文件:

型号

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 已采纳

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

  ask by Steve translate from so

未解决问题?本站智能推荐:

2回复

Django - 使用 TimeField() 作为外键

我有一个Meeting模型,其中meeting_hour从MeetingHour模型中获取其价值。 但是提交表单后出现如下错误: Cannot assign "datetime.time(14, 0)": "Meeting.meeting_hour" must be a "MeetingHour"
3回复

Django-将值从表单传递到模型

我正在使用Django表单模块来获取价值并将其传递给用户个人资料。 唯一的问题是home_type是一个“ forms.ChoiceField”,但forms.ChoiceField没有“ clean_data”类型,那么如何获取单选值并将其传递给用户配置文件模块? 模块的代码如下:
1回复

Django-按表格更新用户实例

在此之前: Djano VERSION = 1.8 ,我必须使用此版本 题 我不知道为什么无法通过表单更新User实例。 我的意思是通过更新:更改数据库和请求中的值 用户模型不是由我创建的,但我使用django.contrib.auth.models.User
1回复

Django - 如何为模型的外键制作表单?

这就是我想要做的。 我想知道是否有人可以建议一个好方法: models.py: 现在我想要一个用户可以输入或编辑DogRequest的页面,但表单应如下所示: 那么我如何在视图中设计该表单? 问题是用户将输入狗的属性,而不是狗。 因此,我需要根据用户输入的内容查找或创
1回复

Django - 使用 form.save() 保存多个对象

在我的应用程序中,必须有两个输入来获取数字,当我在给定范围内(写在输入中)单击create按钮时,必须创建该数字时间的差值。 例如,在第一个输入中我将写“2”,在第二个“5”中,必须创建 3 个对象。 这是我的代码: models.py : forms.py : html :
1回复

Django-从自定义对象获取值

我正在使用Django使用以下代码为用户创建OneToOneField对象: 然后,我使用以下代码为该对象创建了一个表单: 最后,我用 在views.py中获取ControlInformation对象的值,但是它不起作用(错误:“ UserProfile”对象没有属性“
2回复

Django - 如何在填写表单时自动关联用户

所以我正在尝试创建博客应用程序。 在此,我创建了一个模型 Post,其中包含用户提交的内容。 我还创建了一个表单来获取用户对 Post 的输入。 我面临的问题是我无法在获取输入时自动关联引用的登录用户 ID。 模型.py: 为了暂时解决这个问题,我找到了一个选项,可以让用户从用户名列表中进行选
1回复

Django-如何从下拉列表中的选定值动态显示表/数据行

还是我,Django新手。 我试图通过从py表单的dropdowm中选择的值,通过html表显示相关的行/信息。 例如,我从员工模型中获得了一份表格。 我从来自员工模型的LOV中选择员工1。 员工1的技能模型为fk。 从下拉列表中选择员工1后,下面将显示一个表格,列出员工1拥有