2

我正在尝试实现一种使用表单和引导程序从前端删除对象的方法。警报框正在关闭,但在页面刷新时,对象仍然存在,并且没有在数据库中进行删除。

实现这一点的正确方法是什么?请帮忙!

表格.py

 class DeleteAlertForm(forms.ModelForm):
      def is_valid(self):
        form = super(DeleteAlertForm, self).is_valid()
        for f, error in self.errors.iteritems():
          if f != '__all__':
            self.fields[f].widget.attrs.update({'class': 'error', 'value': strip_tags(error)})
        return form

  class Meta:  
    model = Alert
    fields = []

视图.py

@login_required
def delete(request, alert_id):
  if request.method == "POST":
    form = DeleteAlertForm(request.POST)
    if form.is_valid(): # checks CSRF
      a_id = request.POST.get('alert_id', False)
      alert = New.objects.get(pk=a_id)
      alert.delete()
      return HttpResponseRedirect("/")
  else:
    return redirect('/')
  return redirect('/')

模板.html

<div class="alert alert-info alert-block">
<form action="/delete/" method="post">
{% csrf_token %}
<input type="hidden" value="{{alert.id}}" name="alert_id">
<button type="submit" class="close" data-dismiss="alert">×</button>
</form>
</div>

网址.py

url(r'^$/(?P<pk>\d+)/delete$', login_required(DeleteView.as_view(
model=Alert,
success_url='/',
template_name='portal/alert_confirm_delete.html',))),
4

2 回答 2

2

您是否考虑过使用DeleteView

他是您可能为此实现 URL 的方式:

    url(r'^mymodel/(?P<pk>\d+)/delete/$', login_required(DeleteView.as_view(
        model=MyModel,
        success_url="/mymodel/deleted/",
        template_name="myapp/mymodel_confirm_delete.html",
    ))),

您需要为您希望能够删除的每个模型实现类似的东西。但是,您需要的唯一其他代码urls.py是导入 DeleteView。但是,您可以为所有模型使用相同的模板和成功 URL。

于 2013-08-31T10:45:47.983 回答
2

您可以使用引导程序轻松地将 Django 与您自己的删除模板一起使用。
由于用户界面和重定向被描述为符合预期,错误似乎表明您设置了错误的模型:New在您的delete操作中,在您更新/发布您的修改后变得清晰urls.py。运行删除的模型应该是Alert

在您的delete操作中,由与 -entries 的主键对应的条目组成的New查询集被选择为等于alert_id

  alert = New.objects.get(pk=a_id)

预期的模型应该是Alert

New使用条目从模型中获取条目,请在模型中Alert设置如下ForeignKey关系。New例如:

class New(models.Model):
  alert = models.ForeignKey(Alert, verbose_name=_("Alert posts"))
  ....

因此,Django 的 Object-Relational-Mapper 将创建一个alert_id使用适当关系 CONSTRAINTS 和 ForeignKeys 调用的数据库字段。

之后不要忘记在 shell 上运行syndb。例如使用manage.py syndb

Django 可能抛出了一个DoesNotExist类似于所示的异常:

In [2]: appname.models.New.objects.get(pk=-1)
---------------------------------------------------------------------------
DoesNotExist                              Traceback (most recent call last)
/usr/local/lib/python2.6/dist-packages/django/core/management/commands/shell.pyc in <module>()
----> 1 lead.models.Lead.objects.get(pk=-1)

/usr/local/lib/python2.6/dist-packages/django/db/models/manager.pyc in get(self, *args, **kwargs)
    129
    130     def get(self, *args, **kwargs):
--> 131         return self.get_query_set().get(*args, **kwargs)
    132
    133     def get_or_create(self, **kwargs):
....
DoesNotExist: Lead matching query does not exist.

虽然默认情况下 Django 设置为在打开 DEBUG 时向您显示异常settings.py,但您会立即在代码中重定向并且没有处理/输出异常。

默认情况下仍应记录异常,并将其写入日志文件,其位置取决于您正在运行的服务器。

settings.py您可以使用变量在项目中设置日志处理LOGGING = {...}。请参阅有关日志记录的 Django 手册

于 2013-09-01T11:08:04.817 回答