【发布时间】:2022-02-08 01:39:39
【问题描述】:
我在与 React 应用程序交互的项目中使用 Django-Rest-Framework(ViewSet 方法)。所以,我没有使用 Django 管理员,也没有使用 Django 表单。
我的项目结构是:
- 查看
- 序列化器
- 型号
我需要做的是在模型方法调用之前执行操作:
- 在模型字段中插入 request.user。
- 在 Model.save() 之后启动打印机进程
- .....
我在 Django.docs 上阅读了很多关于 django-way to do 的内容,那里似乎显示了类似 Django-Admin 的项目,这不是我的情况。
另一方面,通过阅读 Stack 在其他主题中的答案,这样做的方式似乎是:“它会起作用,但是,这不是正确的方式”。
- 根据 Django 的文档,执行该操作的最佳方法是使用一个名为 admin.py 的新文件,我将在其中注册绑定到可以支持保存、删除等的模型的操作,但是,目前尚不清楚这种方法是要这样做还是仅用于提供 Django-Admin 方式来执行操作。
# app/models.py
from django.db import models
from django.contrib.auth.models import User
class Post(models.Model):
user = models.ForeignKey(User)
content = models.TextField()
class Comment(models.Model):
post = models.ForeignKey(Post)
user = models.ForeignKey(User)
content = models.TextField()
# app/admin.py
from app.models import Post, Comment
from django.contrib import admin
class CommentInline(admin.TabularInline):
model = Comment
fields = ('content',)
class PostAdmin(admin.ModelAdmin):
fields= ('content',)
inlines = [CommentInline]
def save_model(self, request, obj, form, change):
obj.user = request.user
obj.save()
def save_formset(self, request, form, formset, change):
if formset.model == Comment:
instances = formset.save(commit=False)
for instance in instances:
instance.user = request.user
instance.save()
else:
formset.save()
admin.site.register(Post, PostAdmin)
根据我听到的答案,最好的方法是在模型上使用类似的东西:
class MyModelForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
return super(MyModelForm, self).__init__(*args, **kwargs)
def save(self, *args, **kwargs):
kwargs['commit']=False
obj = super(MyModelForm, self).save(*args, **kwargs)
if self.request:
obj.user = self.request.user
obj.save()
return obj
我想知道的是: 执行该操作的最佳方式是什么,在哪些文件上,最佳结构是什么。
【问题讨论】:
标签: django python-3.x django-rest-framework