【问题标题】:Django - Clone model object in Class based ListViewDjango - 在基于类的 ListView 中克隆模型对象
【发布时间】:2020-01-21 15:50:13
【问题描述】:

我有一个 list.html 有很多记录和一列包含一个按钮来克隆特定记录,如下所示:

{% for betr in object_list %}
    ....
    <td>
        <button type="button" class="btn btn-first" onclick="window.location='../clone/{{betr.ID}}';">
            <span class="fas fa-copy" style="font-size: 1rem;"></span>
        </button>
    </td>
{% endfor %}

我的urls.py 看起来像这样:

urlpatterns = [
...
path('update/<int:pk>/', UpdateView.as_view(), name='update'),
path('clone/<int:pk>/', CloneView.cloneRecord(), name='clone'),
...
]

我的views.py 包含一个克隆视图,该视图具有克隆记录并打开带有克隆记录的UpdateView 进行编辑的功能:

class CloneView(LoginRequiredMixin):
    login_url = '/accounts/login/'
    model = mymodel
    def cloneRecord(self,**kwargs):
        record = mymodel.objects.filter(id=self.request.GET['ID'])[0]
        record.id = None
        record.save()
        return http.HttpResponseRedirect(reverse('/update/', kwargs={'pk':record.id}))

目前我收到以下错误:

TypeError: cloneRecord() 缺少 1 个必需的位置参数:'self'

我错过了什么?任何帮助表示赞赏。

【问题讨论】:

    标签: django model clone django-class-based-views


    【解决方案1】:

    如果两个视图都有单独的 url,那么你应该像这样在GET 方法中编写代码

    class CloneView(LoginRequiredMixin, View):
        login_url = '/accounts/login/'
    
        def get(self,**kwargs):
            record = mymodel.objects.filter(id=self.request.GET['ID'])[0]
            record.id = None
            record.save()
            return http.HttpResponseRedirect(reverse('/update/', kwargs={'pk':record.id}))
    

    你的网址应该是这样的

    path('clone/<int:pk>/', CloneView.as_view(), name='clone'),
    

    请记住,as_view 用于调用基于类的视图。你不能根据你调用的函数来改变。

    【讨论】:

    • 这最终导致以下错误:AttributeError: type object 'CloneView' has no attribute 'as_view'. 将通用 UpdateView 添加到类定义中,然后遇到此错误:get() takes 1 positional argument but 2 were given
    • 抱歉,您必须从View 继承此视图。我之前错过了。
    • 从 View 继承做了第一步。需要稍微改变一下功能,但现在让它工作了。添加了最终类定义供上面参考。
    【解决方案2】:

    去掉括号,CloneView.cloneRecord()

    path('clone/<int:pk>/', CloneView.cloneRecord, name='clone'),
    

    【讨论】:

      【解决方案3】:

      这是另一个克隆对象的变体。最大的优点是您打开所需的 CreateView 然后它会填充您从中获得 id 的对象,然后您可以根据需要保存它。不要忘记在模型中实现一些唯一约束以避免重复记录! 这样就不会出现用户生成无用的重复记录的情况,因为只有在用户真正使用 AssemblyCloneView 中的提交按钮保存时才会保存!

      urls.py:

      urlpatterns = [
      ...
      path('assembly/clone/<int:pk>/', AssemblyCloneView.as_view(), name='assembly_clone'),
      

      template.html:(在我的例子中使用引导按钮)

      <a class="btn btn-light btn-sm" href="{% url 'engineering:assembly_clone' record.id %}">Clone</a>
      

      views.py:

      class AssemblyCloneView(LoginRequiredMixin, CreateView):
          model = Assembly
      
          """
          Get object desired from url with record.id and override the object context with it.
          """
          def get(self, request, *args, **kwargs):
              self.object = self.get_object()
              context = self.get_context_data(object=self.object)
              print(context)
              return self.render_to_response(context)
      
          def get_success_url(self):
              return reverse_lazy('engineering:assembly_detail', kwargs={'pk': self.object.pk})
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-23
        • 1970-01-01
        • 1970-01-01
        • 2012-02-18
        • 1970-01-01
        • 2012-07-25
        • 1970-01-01
        相关资源
        最近更新 更多