2017-08-19 49 views
0

我有以下窗體顯示用戶設置模型的條目。當選中時,我希望按鈕捕獲它的pk並將其發送到刪除視圖。這裏是當前的代碼,但我缺少這部分。django從選定的表單中刪除模型條目選項

user_detail HTML模板

   <form id="SettingsListForm"><label>&nbsp Settings List : &nbsp &nbsp &nbsp</label> 
        {% if user.usersetting.first %} 
         <select class="form-control" name="settingslist" id = "settingslist" form="SettingsListForm" > 
          {% for settings in user.usersetting.all %}  
            <option value="{{ settings.file.url }}">{{ settings }} 
            </option> 

          {% endfor %} 
         </select> 
        {% else %} 
         <li class="list-group-item">NO SETTINGS YET</li> 
        {% endif %} 
        <button class="btn btn-outline-light btn-circle"><i class="glyphicon glyphicon-minus" href="{% url 'my_app:setting_delete' pk=user.usersetting.last.id %}"></i></button> 

        {% block delete_setting_confirm_block %} 

        {% endblock %} 
       </form> 

與delete_setting_confirm_block setting_confirm_delete HTML模板

{% extends 'login_app/user_detail.html' %} 
{% block delete_setting_confirm_block %} 
    <h4> 
     ARE YOU <b>REALLY</b> SURE YOU WANT TO <b>DELETE</b> THIS SETTING ? 
     <form method="POST"> 
      {% csrf_token %} 
      <button type="submit" class="btn btn-outline-light btn-danger" value="Delete">YES</button> 
      <a class="btn btn-outline-light btn-default" href="{% url 'login_app:user_detail' pk=user.id %}"><b>NO</b></a> 
     </form> 
    </h4> 
{% endblock %} 

my_app應用的URL

url(r'^setting/(?P<pk>\d+)/$',views.UserSettingDeleteView.as_view(),name='setting_delete'), 

UserSettingDeleteView在程序my_app意見

class UserSettingDeleteView(DeleteView): 

    model = models.UserSetting 
    template_name = 'my_app/setting_confirm_delete.html' 

    def get_success_url(self): 
     return reverse('my_app:user_detail', kwargs={'pk': self.object.user.pk}) 

不知怎的,類似的技術使用listgroups時工作正常:在user_detail HTML

工作樣本

 <ul class="list-group"> 
      {% if user.userdata.first %} 
       {% for data in user.userdata.all %} 
        <li class="list-group-item">{{ data }}<a class="btn btn-outline-light btn-circle" href="{% url 'my_app:data_delete' pk=data.pk %}"><i class="glyphicon glyphicon-remove"></i></a><a href="{{ data.file.url }}" class="btn btn-outline-light btn-circle" download><i class="glyphicon glyphicon-save"></i></a></li> 
       {% endfor %} 
       {% block delete_data_confirm_block %} 

       {% endblock %} 
      {% else %} 
       <li class="list-group-item">NOTHING RECORDED YET</li> 
      {% endif %} 

     </ul> 

回答

0

在你template.html,你應該創建一個刪除表單,如下所示:

<form action="{% url 'my_app:setting_delete' pk=user.usersetting.last.id %}" method="post"> 
    {% csrf_token %} 
    <input type="submit" value="Delete" class="btn btn-outline-light btn-circle"> 
</form> 

因爲在HTML你不能直接發送PUTDELETE,通過POST請求,你應該它。閱讀this會很有幫助,很好解釋。

UserSettingDeleteView可以如此簡單:

from django.views.generic.edit import DeleteView 
from django.urls import reverse_lazy 


class UserSettingDeleteView(DeleteView): 
    model = MyModel 
    # Replace with the model you want to delete (User) 

    success_url = reverse_lazy('my_app:setting_list') 
    # After deletion, possibly you will want to redirect the user to the list view 

內置DeleteView關心自己找到你通過你的網址,並刪除它的pk參數模型,你只需要配置modelsuccess_url字段。

現在,如果您單擊您的刪除按鈕,您應該期望刪除所需的條目並將用戶重定向到列表視圖。

編輯:

我忘了,你想通過選擇此項。在這裏,您將不得不使用一些JavaScript來查找當前選定的元素,並將其發送到​​,並將其發送到pk

起初,加id的你option標籤,就像這樣:

<select class="form-control" name="settingslist" id="settingslist" form="SettingsListForm"> 
    {% for settings in user.usersetting.all %}  
     <option value="{{ settings.file.url }}" id="{{ settings.id }}">{{ settings }}</option> 
    {% endfor %} 
</select> 

,然後添加一些的jQuery

var settingId = $('#SettingsListName').find(":selected").attr('id'); 

最後,你需要發送settingId到相應的url,但我對JavaScript不是很熟悉。

+0

嗨@wencakisa,感謝您的評論。我嘗試了類似的建議,但問題似乎是在'select'組件中獲取選定元素的pk。我只是用更詳細的代碼編輯了我的問題。 – Pierre

0

嘗試在您的表單中放置一個隱藏的輸入。現在,沒有任何東西正在通過表格。

<input type="hidden" name="del_setting" value="{{user.usersetting.last.id}}"> 

所以你的形式看起來像這樣

<form method="POST"> 
{% csrf_token %} 
    <input type="hidden" name="del_setting" value="{{user.usersetting.last.id}}"> 
    <button type="submit" class="btn btn-outline-light btn-danger" value="Delete">YES</button> 
    <a class="btn btn-outline-light btn-default" href="{% url 'login_app:user_detail' pk=user.id %}"><b>NO</b></a> 
</form> 

你也可能應該這樣,你不把表單中的表單在用戶詳細信息模板移動了這一點,目前的形式:

{% block delete_setting_confirm_block %} 
{% endblock %} 
0

前面提到的解決方案中沒有將工作,所以我想這個問題是應該顯示設置的pk嵌套的引導選擇項目。 爲簡單起見我然後用list-group代替

   <ul class="list-group"> 
        {% if user.usersetting.first %} 
         {% for settings in user.usersetting.all %} 
          <li class="list-group-item">{{ settings }}<a class="btn btn-outline-light btn-circle" href="{% url 'my_app:setting_delete' pk=settings.pk %}"><i class="glyphicon glyphicon-remove"></i></a></li> 
         {% endfor %} 
         <label>Create a new setting...</label> 
         <a class="btn btn-outline-light btn-circle"><i class="glyphicon glyphicon-plus"></i></a> 
        {% else %} 
         <li class="list-group-item">Create a new setting...<a class="btn btn-outline-light btn-circle"><i class="glyphicon glyphicon-plus"></i></a></li> 
        {% endif %} 
        {% block delete_setting_confirm_block %} 

        {% endblock %} 
       </ul> 

作爲一種解決方法後,問題,這個效果很好。

相關問題