Django:使用视图和表单复制模型对象

Posted

技术标签:

【中文标题】Django:使用视图和表单复制模型对象【英文标题】:Django: copy a model object using views and forms 【发布时间】:2015-10-13 06:28:46 【问题描述】:

我有一个 Django (1.8) 模型,它有一些基于类的通用视图:列表、更新、删除、详细信息、创建。 https://docs.djangoproject.com/en/1.8/ref/class-based-views/

在详细信息或列表视图中,我有一个按钮,我想这样做:

    创建对象的副本 将数据加载到表单中并显示以供用户编辑/保存新对象(可以使用现有的更新或创建视图,还是新的?)

我可以使用以下信息克隆模型: How do I clone a Django model instance object and save it to the database?

但我无法通过从视图开始并以包含复制的对象数据的表单结束来完成这项工作。

谢谢!

部分视图.py

class List(ListView):
  model = Announcement
  template_name = 'announcements/list.html'

class Create(CreateView):
  model = Announcement
  form_class = AnnouncementForm
  template_name = 'announcements/form.html'

  def form_valid(self, form):
    data = form.save(commit=False)
    data.author = self.request.user
    data.save()
    return super(Create, self).form_valid(form)

class Update(UpdateView):
  model = Announcement
  form_class = AnnouncementForm
  template_name = 'announcements/form_update.html'

  @method_decorator(login_required)
  def dispatch(self, *args, **kwargs):
    return super(Update, self).dispatch(*args, **kwargs)

部分表单.py

class AnnouncementForm(forms.ModelForm):
    class Meta:
        model = Announcement
        exclude = ['author']

部分列表.html

% for object in object_list %
      <p>object.title</p>
      <a class="btn btn-danger" href="% url 'announcements:delete' object.id %" role="button">Delete</a>
      <a class="btn btn-info" href="% url 'announcements:update' object.id %" role="button">Edit</a>
      <a class="btn btn-primary" href="" role="button">Copy</a>
% endfor %

我点击 list.html 中的“复制”按钮,我想复制对象并在表单中打开新的副本进行编辑。

【问题讨论】:

欢迎来到 Stack Overflow!这个问题有点宽泛;您能否包含有关您遇到的特定问题的信息?请参阅How to Ask 谢谢,我添加了一些特定的代码,这样可以缩小范围吗? 【参考方案1】:

它认为我想通了!

urls.py

#eg: myapp/5/copy/
#where 5 is the item I want to copy
url(r'^(?P<id>[0-9]+)/copy/$', views.item_copy, name='item_copy'),

views.py:

def item_copy(request, id):
    new_item = get_object_or_404(MyModel, pk = id)
    new_item.pk = None #autogen a new pk (item_id)
    new_item.name = "Copy of " + new_item.name #need to change uniques

    form =  MyForm(request.POST or None, instance = new_item)

    if form.is_valid():
        form.save()
        return redirect('my_view')

    context = 
        "form": form,
        #other context
     

    return render(request, "form.html", context)

【讨论】:

【参考方案2】:
class CopyView(ManageAnnouncement, DeleteView):

    def dispatch(self, *args, **kwargs):
        obj = self.get_object()
        obj.pk = None
        copy = obj.save()
        return HttpResponseRedirect('/announcement/edit/%s' %(copy.id))
        # Change the redirect page to the one you need.

我继承了一个名为 ManageAnnouncement 的基类。您可以将多个类共有的方法或变量放在一个抽象基类中,并在添加、编辑、删除、复制等过程中继承它,从而使代码变得“干”。

【讨论】:

以上是关于Django:使用视图和表单复制模型对象的主要内容,如果未能解决你的问题,请参考以下文章

Django将硬编码的href链接添加到管理模型的表单视图页面

Django 表单:查询结果定义的字段,单个视图同时更新多个对象

如何将表单视图作为 django 中的上下文传递给另一个视图?

多对多模型的 Django 表单。如何从视图/模板填写表格?

基于 Django 类的视图 - 具有两个模型表单的 UpdateView - 一个提交

如何在 django 中以一种形式组合多个模型? [复制]