2024-09-09

Django SU(Site-Superuser)是一个Django应用,它提供了一个快捷方式来以站点管理员(superuser)的身份登录。它不是一个命令行工具,而是一个可以集成到Django项目中的应用。

要使用Django SU,你需要按照以下步骤操作:

  1. 安装Django SU:

    你可以通过pip安装Django SU:

    
    
    
    pip install django-su
  2. 添加su到你的INSTALLED_APPS设置:

    
    
    
    INSTALLED_APPS = [
        # ...
        'su',
    ]
  3. 添加su URL到你的项目的urls.py文件:

    
    
    
    from django.urls import path, include
     
    urlpatterns = [
        # ...
        path('su/', include('su.urls')),
    ]
  4. 运行Django的迁移命令来创建必要的数据库表:

    
    
    
    python manage.py migrate su
  5. 确保你的项目有一个超级用户账号。如果没有,你可以使用以下命令创建一个:

    
    
    
    python manage.py createsuperuser
  6. 现在,你可以通过访问 /su/ (或者你自定义的路径)来以管理员身份登录。

注意:Django SU不是一个命令行工具,它是通过Web界面工作的,因此它需要一个运行中的Web服务器来工作。

由于Django SU是一个第三方应用,你可能需要查看它的文档或源代码来了解如何进一步配置或使用它。

2024-09-09



from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.utils.translation import gettext
from .models import User
from .tasks import send_confirmation_email
 
class UserAdmin(BaseUserAdmin):
    ordering = ['id']
    list_display = ['email', 'username', 'is_staff']
 
    fieldsets = (
        (None, {'fields': ('email', 'password')}),
        (gettext('Personal info'), {'fields': ('username',)}),
        (gettext('Permissions'), {
            'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions'),
        }),
        (gettext('Important dates'), {'fields': ('last_login',)}),
    )
 
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'password1', 'password2', 'is_staff', 'is_superuser'),
        }),
    )
 
    search_fields = ('email',)
    list_filter = ('is_staff', 'is_superuser', 'is_active')
 
    def save_model(self, request, obj, form, change):
        if not obj.id:
            send_confirmation_email.delay(obj.email)
        super().save_model(request, obj, form, change)
 
admin.site.register(User, UserAdmin)

这段代码定义了一个UserAdmin类,继承自BaseUserAdmin,并对User模型的后台管理界面进行了定制。在保存模型时,如果User对象是新创建的(not obj.id),则会异步调用send_confirmation_email任务来发送确认邮件。这是一个很好的实践,展示了如何在Django中结合异步任务处理特定的业务逻辑。

2024-09-09



from django.db import connection
 
def example_function():
    # 使用 Django 的数据库 API 执行原始 SQL 查询
    with connection.cursor() as cursor:
        # 创建一个示例表
        cursor.execute("""
            CREATE TABLE IF NOT EXISTS myapp_example (
                id serial PRIMARY KEY,
                name varchar(100) NOT NULL
            )
        """)
 
        # 插入一条记录
        cursor.execute("INSERT INTO myapp_example (name) VALUES (%s)", ["Django"])
 
        # 查询记录
        cursor.execute("SELECT * FROM myapp_example")
        rows = cursor.fetchall()
        for row in rows:
            print(row)
 
        # 更新记录
        cursor.execute("UPDATE myapp_example SET name = %s WHERE id = %s", ["Django Framework", 1])
 
        # 删除记录
        cursor.execute("DELETE FROM myapp_example WHERE id = %s", [1])
 
        # 提交事务
        transaction.commit_unless_managed()

这段代码演示了如何在Django中使用原始的SQL语句来操作PostgreSQL数据库。它首先创建了一个示例表(如果该表不存在),然后插入了一条记录,接着查询了这条记录,并对其进行了更新和删除操作。最后,它确保了在自动管理事务的环境中,如果你使用的是Django的ORM,那么你不需要手动提交事务。

2024-09-09



from django.contrib.auth.models import User
from django.db import models
 
# 学习笔记模型
class Note(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    body = models.TextField()
 
    def __str__(self):
        return self.title
 
# 用户模型扩展,如果需要额外的字段可以在这里添加
class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    # 这里可以添加更多关于用户的信息,例如是否为教师、注册时间等
 
    def __str__(self):
        return self.user.username

这段代码定义了两个模型:NoteUserProfileNote 模型用来存储用户的学习笔记,它有标题(title)和内容(body)字段。UserProfile 模型是对 Django 默认的 User 模型的扩展,可以用来存储用户的额外信息。这个例子演示了如何将学习笔记和用户信息结合起来,并且使用了 Django 的外键和一对一外键关系。

2024-09-09

由于篇幅限制,我无法在这里提供完整的Django学习笔记。但是,我可以提供一个概览和一些核心概念的例子。

概览:

  1. 安装Django
  2. 创建项目和应用
  3. Django模型
  4. Django视图和URL配置
  5. Django模板
  6. Django表单和Admin
  7. Django视图和模板通信
  8. Django ORM进阶
  9. Django信号和钩子
  10. Django中间件
  11. Django缓存和Session
  12. Django项目部署

核心概念例子:

模型(Model)




from django.db import models
 
class Person(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()

视图(View)




from django.http import HttpResponse
 
def home(request):
    return HttpResponse("Hello, World!")

URL配置(urls.py)




from django.urls import path
from .views import home
 
urlpatterns = [
    path('', home, name='home'),
]

模板(Template)




<!-- templates/home.html -->
<html>
<head><title>Home Page</title></head>
<body>
  <h1>{{ greeting }}</h1>
</body>
</html>

视图和模板通信(View)




from django.shortcuts import render
 
def home(request):
    context = {'greeting': 'Hello, World!'}
    return render(request, 'home.html', context)

这些例子展示了如何使用Django框架的基本组件来创建一个简单的网站。实际开发中,你可能还需要处理更复杂的逻辑,如用户认证、数据库迁移、单元测试等。Django提供了丰富的文档和社区支持,可以帮助开发者学习和成长。

2024-09-09



from django.db import models
from django.utils import timezone
 
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
 
    def __str__(self):
        return self.question_text
 
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
 
class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
 
    def __str__(self):
        return self.choice_text

这个简单的例子展示了如何使用Django模型来创建一个基本的投票应用。Question模型代表一个问题,它有一个question_text字段来存储问题的文本,和一个pub_date字段来记录问题的发布时间。Choice模型代表一个投票选项,它有一个choice_text字段来存储选项的文本,和一个votes字段来记录得票数。这两个模型之间存在一个外键关系,每个Choice对象都关联到一个Question对象。

2024-09-09

在Django Ninja中,你可以使用Pydantic模型来定义schema。首先,你需要安装Django Ninja,然后创建一个Pydantic模型。

以下是一个简单的例子:




from ninja import Schema
from pydantic import BaseModel, Field
 
# 定义一个Pydantic模型作为schema
class Item(BaseModel):
    name: str = Field(..., description="The item's name")
    description: str = Field(None, description="The item's description")
    price: float = Field(..., description="The item's price")
 
# 使用Schema类创建API的路由和业务逻辑
@api.post("/items/")
def create_item(item: Item):
    # 这里是创建项目的逻辑
    return item

在这个例子中,我们定义了一个名为Item的Pydantic模型,它有namedescriptionprice三个字段。在create_item函数中,我们通过类型注解item: Item指定了期望的输入数据类型为Item。这样就可以确保客户端传递的JSON数据与我们的模型匹配,并且自动进行数据校验。

2024-09-09



from django.contrib.auth import authenticate, login
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
from django.shortcuts import redirect
 
# 用户登录视图
def user_login(request):
    # 如果是通过POST请求进行登录
    if request.method == 'POST':
        # 获取用户名和密码
        username = request.POST.get('username')
        password = request.POST.get('password')
 
        # 使用 Django 的 authenticate 函数来验证用户名和密码
        user = authenticate(request, username=username, password=password)
 
        # 如果用户验证成功
        if user is not None:
            # 用户登录
            login(request, user)
            # 重定向到首页或其他页面
            return redirect('index')
        else:
            # 如果用户名或密码不正确,返回错误信息
            return HttpResponse('Invalid login credentials')
 
    # 如果不是通过POST请求,则显示登录页面
    return render(request, 'login.html')
 
# 必须登录才能访问的视图
@login_required
def secret_page(request):
    # 只有登录用户可以看到的内容
    return HttpResponse('Secret content for logged-in users.')

这个代码示例展示了如何在Django中实现用户登录功能。首先,我们定义了一个视图函数user_login来处理登录请求。如果请求方法是POST,我们获取用户名和密码,然后使用Django的authenticate函数来验证用户名和密码。如果验证成功,我们使用login函数来登录用户,并重定向到首页。如果验证失败,我们返回错误信息。对于非登录请求,我们渲染登录页面。另外,我们定义了一个使用@login_required装饰器的视图函数secret_page,这个视图函数只有在用户登录后才能访问。

2024-09-09



from django.db import models
 
# 假设我们有一个User模型,我们想要追踪用户的创建和修改时间
class User(models.Model):
    name = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)  # 创建时自动设置当前时间
    updated_at = models.DateTimeField(auto_now=True)      # 更新时自动更新为当前时间
 
# 使用QuerySet的示例
def get_users():
    # 获取所有用户,但不会立即从数据库加载数据
    users = User.objects.all()
    print(users)  # 输出QuerySet,例如: <QuerySet [<User: User object (1)>, <User: User object (2)>]>
 
    # 当我们实际需要数据时,QuerySet才会从数据库中获取数据
    for user in users:
        print(user.name)
 
# 使用Model实例的示例
def create_user():
    user = User.objects.create(name='新用户')
    print(user.created_at, user.updated_at)  # 创建时和更新时的时间戳将会被设置
 
    user.name = '已更新'
    user.save()  # 保存用户实例,更新时间戳将会被更新
    print(user.created_at, user.updated_at)

这段代码展示了如何在Django中使用auto_now_addauto_now来自动设置记录的创建和更新时间,并且演示了QuerySet和Model实例的生命周期。

2024-09-09



# 创建Django项目
django-admin startproject mysite
 
# 进入项目目录
cd mysite
 
# 创建应用
python manage.py startapp blog
 
# 运行开发服务器
python manage.py runserver

上述命令行展示了如何使用Django创建一个简单的网站。首先,我们使用django-admin工具创建了一个名为mysite的项目。接着,我们进入了项目目录,并使用manage.py工具创建了一个名为blog的应用。最后,我们启动了开发服务器,以便可以在本地进行网站的开发和测试。