2013-08-31 105 views
2

我想實現一種方法來使用窗體和Bootstrap從前端刪除對象。警報框正在關閉,但在頁面刷新時,對象仍然存在,並且數據庫中沒有刪除。django從帖子(引導)刪除對象

實現這個的正確方法是什麼?請幫忙!

forms.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 = [] 

views.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('/') 

template.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> 

urls.py

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

請張貼您的'urls.py'或coe您定義要用於渲染的模板。另外顯示用於分配給'alert.id'變量的代碼部分 –

+0

我已經使用urls.py更新了帖子,取自@ MatthewDaly的示例.. – Joar

+0

帖子現在被刪除嗎?我會假設這個錯誤是在一個空的查詢集中,你不會注意到由於通過HttpResponseRedirect進行的即時重定向以及缺少的異常輸出。 PS:不要覺得有必要選擇合適的答案,但這並不能解決您的問題。 –

回答

2

您可以使用引導程序輕鬆地使用Django和您自己的刪除模板。
作爲用戶界面和重定向被描述爲如預期的錯誤看來,你已經設置了錯誤的模式:在你的delete行動,你更新之後變得清晰New /發佈修改後的urls.py。在其上運行刪除模式應該是Alert

在你delete動作包括對應於New -entries主鍵的條目的查詢集被選擇爲等於alert_id

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

預期模型可能應Alert

從使用Alert項模型New取條目,如下所示示範New設置ForeignKey關係。例如:

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

Django的對象關係映射器因此將創建一個DATEBASE場稱爲alert_id與適當的關係約束和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開啓,你可以立即在代碼中重定向和沒有處理/輸出異常。

默認情況下仍應該記錄異常,並將其寫入日誌文件,該文件的位置取決於您正在運行的服務器。

您可以使用變量LOGGING = {...}在項目的settings.py中設置日誌處理。請參閱Django manual on logging

2

你有沒有考慮過使用DeleteView

He're的你可能會如何實施這樣的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。不過,您可以爲所有模型使用相同的模板和成功網址。

+0

謝謝,不知道是否。發現這個頁面比官方文檔中的例子更直接一點。 http://georgebrock.github.io/talks/intro-to-class-based-generic-views/ – Joar

+0

@JoarSvensson通用視圖是Django的殺手功能之一。除非有充分的理由,否則我總是會使用通用視圖。它們覆蓋絕大多數用例,並且易於擴展,並且它們可以爲您節省多少時間是令人難以置信的。 –

+0

我發現在模板中使用這些類有點困難..我不想爲每個表單創建一個新頁面......怎麼可能以我開始的方式來實現它? – Joar