Django 在不同的视图中更新相同的模型
Posted
技术标签:
【中文标题】Django 在不同的视图中更新相同的模型【英文标题】:Django update same model in different view 【发布时间】:2021-07-13 20:26:58 【问题描述】:我有一个书籍模型,作者是多对多字段:
class Book(models.Model):
title = models.CharField(max_length=255, verbose_name="Title")
author = models.ManyToManyField(User, related_name="Task")
content = models.TextField(blank=True, null=True)
作者模型:
class User(AbstractUser):
introduction = models.CharField()
job_title = models.CharField()
在Book的app中,我使用modelform和UpdateView创建了一个updateview,这部分很容易做到。
# example.com/book/1/edit
path('<int:pk>/edit', views.BookEditView.as_view(), name='book-edit')
但是,在用户的应用程序中,我希望用户也能够编辑自己的书籍:
# example.com/user1/book/1/edit
path('<username>/book/<int:pk>/edit', views.UserEditBookView.as_view(), name='editbook')
问题:
-
如果我使用通用视图,它可以带两个参数吗?毕竟只需要一个参数(主键)就可以让 Django 知道哪一个需要更新。
如果我需要使用基于类的视图,我应该怎么做?
【问题讨论】:
【参考方案1】:使用通用视图时无需传递两个参数,假设您已经在forms.py
中拥有您的表单
generic view
:
def edit_func(request, pk):
object = Model.objects.get(your_model_id = pk)
form = forms.FormName(instance=object)
context = 'form': form
if request.method == 'POST':
form = forms.FormName(
request.POST, request.FILES, instance=object)
if form_up.is_valid():
instance = form.save(commit=False)
instance.user = request.user
instance.save()
return redirect('app_name:view_name')
return render(request, "template.html", context)
对于urls.py
,您只需传递<int:pk>
,它可以是int
或str
对于基于类的视图,您需要分别定义get
和post
函数,所以它应该是这样的:
class based view
:
class EditClass(View):
def get(self, request, obj_id):
objMod = ModelName.objects.get(id = obj_id)
form = New_Object(instance = objMod)
context =
"form": form,
return render(request, "your_template.html", context)
def post(self, request, obj_id):
objMod = ModelName.objects.get(id = obj_id)
form = New_Object(request.POST, request.FILES , instance=objMod)
context =
"form": form,
if(form.is_valid()):
objMod=form.save(commit=False)
objMod.save()
return redirect("your_url_redirect")
return render(request,"your_template.html", context)
对于基于类的urls.py
视图:
path('edit/<int:obj_id>',views.EditClass.as_view()),
【讨论】:
以上是关于Django 在不同的视图中更新相同的模型的主要内容,如果未能解决你的问题,请参考以下文章
如何根据 django 模板中的不同提交按钮在更新视图中自定义成功 url?