【问题标题】:Django update same model in different viewDjango 在不同的视图中更新相同的模型
【发布时间】: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')

问题:

  1. 如果我使用通用视图,它可以带两个参数吗?毕竟只需要一个参数(主键)就可以让 Django 知道哪一个需要更新。
  2. 如果我需要使用基于类的视图,我应该怎么做?

【问题讨论】:

    标签: 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;,它可以是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()),
     
    

    【讨论】:

      猜你喜欢
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多