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,您只需传递&lt;int:pk&gt;,它可以是intstr

对于基于类的视图,您需要分别定义getpost 函数,所以它应该是这样的:

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?

Django:渲染视图后如何更新模型?

每次在Django中生成视图时更新模型

在多个 django 模板文件中显示相同 html 块的最佳 DRY 方法

Django - 相同的 html,不同的视图

当url模式与模型名称相同时,Django管理员加载视图模板