Django如何在类中注册用户

Posted

技术标签:

【中文标题】Django如何在类中注册用户【英文标题】:Django How to Register user in classes 【发布时间】:2015-08-07 10:40:26 【问题描述】:

我目前正在使用 Django 1.8.3 和 Python 3.4,我创建了以下站点,这是一个用于注册课程 (http://imgur.com/G5JvCzY) 的模拟站点,其中标题链接到另一个页面,例如 (http://imgur.com/cZlfyBn) ,我想做的是让超级用户能够通过第2页中的按钮在这些类中“注册”,有什么建议吗?下面是我的代码,对不起文字墙:

项目目录:

* cacademy:
    * __pycache__
    * __init__
    * settings
    * urls
    * wsgi
* Classes:
    * __pycache__
    * migrations
    * static
    * __init__
    * admin
    * models
    * tests
    * urls
    * views
* templates:
    * cacademy:
        * base.html
        * classes_list.html
        * courses_detail.html
*accounts:
    * __pycache__
    * migrations
    * __init__
    * admin
    * models
    * tests
    * urls
    * views
* db.sqlite3
* manage.py

我的模特:

from django.db import models
from django.utils import timezone


class Course(models.Model):
    title = models.CharField(max_length=200)
    text = models.TextField()
    teachername = models.TextField(max_length=200)
    teacherinfo = models.TextField()
    started_date = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.title

我的观点:

from django.shortcuts import render
from django.utils import timezone
from .models import Course
from django.shortcuts import render, get_object_or_404

def classes_list(request):
    courses = Course.objects.filter(started_date__lte=timezone.now()).order_by('started_date')
    return render(request, 'cacademy/classes_list.html', 'courses': courses)

def course_detail(request, pk):
    course = get_object_or_404(Course, pk=pk)
    return render(request, 'cacademy/courses_detail.html', 'course': course)

我的学院\urls.py:

from django.conf.urls import include, url
from Classes import views
from django.contrib import admin
admin.autodiscover()

    urlpatterns = [
        url(r'^admin/', include(admin.site.urls)),
        url(r'^$', views.classes_list, name='classes_list'),
        url(r'^(?P<pk>[0-9]+)/course/$', views.course_detail, name='course_detail'),
        url(r'^accounts/', include('accounts.urls', namespace='accounts')),
    ]

我知道我可以将 ForeignKey 用于 OneToMany 关系,但我无法掌握如何将其输入到我的代码中的想法,我希望超级用户在上面的这些课程中注册,任何帮助将不胜感激。

谢谢

【问题讨论】:

【参考方案1】:

在模型级别您可以使用ManyToMany 关系将用户与课程联系起来,如下所示:

class Course(models.Model):
    title = models.CharField(max_length=200)
    text = models.TextField()
    teachername = models.TextField(max_length=200)
    teacherinfo = models.TextField()
    started_date = models.DateTimeField(default=timezone.now)
    users = models.ManyToManyField('auth.User', verbose_name='Students',
                                   related_name='courses', null=True, blank=True)

    def __str__(self):
        return self.title

然后在 POST 处理程序的视图中,您可以检查request.user.is_superuser 属性,如果为真,则通过course.users.add(user) 将用户注册到课程。您可以在Django documentation site找到详细信息

【讨论】:

感谢您的信息,但每个新“课程”都会自动拥有所有用户,我该如何删除它们? @Sylas 不,不是。每个新课程在创建时都没有用户,这只是两个表之间的数据库层关系:课程和用户。当您需要将用户添加到课程时,您可以使用course.users.add(user),当您需要删除它时,使用course.users.remove(user)。在这些操作之一之后,您应该执行course.save()

以上是关于Django如何在类中注册用户的主要内容,如果未能解决你的问题,请参考以下文章

如何创建具有选择的多个用户模型?

如何找到按钮注册

HTML/Javascript 表单 如何将表单数据序列化为 JSON 并在类中显示?

如何在类中定义装饰器?

如何在类中有函数指针?

如何在类中使用 Pyomo 装饰器