2016-04-06 25 views
2

Ben django ve python nispeten yeni ve şimdi birkaç gün PUT ve DELETE istekleri django formları istekleri göndermek nasıl anlamaya çalışıyorum. https://baxeico.wordpress.com/2014/06/25/put-and-delete-http-requests-with-django-and-jquery/PUT ve DELETE Django

Sending a DELETE request from a form in Django

Ama bu konular bu sorunu çözmek yolu benim için kolay değil dikişler:

bu konular buldum. Öyleyse soru şu: Django'da PUT ve DELETE taleplerinin sorgulama formlarını göndermenin kolay bir yolu var.

views.py

class AllRoutes(View): 

model = Schedule 
template_name = 'trains_schedule/all_routes.html' 

def get(self,request,train_id=None): 
    if train_id: 
     train = Schedule.objects.get(pk=int(train_id)) 
     context = {'train':train} 
    else: 
     context = {'schedule_list':Schedule.objects.all()} 
    return render(request,'trains_schedule/all_routes.html',context) 

def delete(self,request,train_id=None): 
    route = get_object_or_404(Schedule, pk=train_id) 
    response = u'Successful delete route {}'.format(route.display_name()) 
    route.delete() 
    return HttpResponse(response) 

urls.py all_routes.html

{% if schedule_list %} 
<h3>{{ "List of all train routes" }}</h3> 
<ul> 
{% for train_route in schedule_list %} 
    <li><a href="{% url 'trains' train_route.id %}">{{ train_route.display_name }}</a></li> 
{% endfor %} 
</ul> 
{% else %} 
<p></p> 
{% endif %} 

{% if train %} 
<h1>{{ train.train }}</h1> 

<h3>{{ "Route info" }}</h3> 
{{ train.display_train }} 

<h3>{{ "Train info" }}</h3> 
{{train.display_train_info}} 

<form method="delete"> 
{% csrf_token %} 
<input type="submit" value="Delete" /> 
</form> 
{% else %} 
<p></p> 
{% endif %} 

Şimdi bu şekilde çalışır

urlpatterns = [ 
url(r'^trains/(?P<train_id>[0-9]+)?$', views.AllRoutes.as_view(), name='trains')] 

: Şimdilik

i bu var:

  • /trenler/tüm trenler yollarının gösterisi listesi ve her rota bağlantılar sağlar
  • /trenler/12 - rota kimliği var() views.py almak ve bu rota hakkında bilgi göstermek

Ve bunu "sil" e bastığımda görmek istiyorum - görünümü DELETE isteği alırsınız. Ben öyle yapıyorum ile sona

:

<form method="post"> 
{% csrf_token %} 
<input id="action_id" type="hidden" name="action" value="Delete"> 
<input type="submit" value="Delete" /> 
</form> 

ve views.py i action_id == post isteğinin işleme ekleyin

"Sil" Ama SİL gerçek yapmak istiyorum ve PUT isteği, POST isteğini yapmam gerektiğini anlamak için ayrıştırmak yerine - silme veya rota değiştirme veya yenisini ekleme.

Ben bu bölümünü değiştirmek gerektiğini anlamanızı:

<form method="delete"> 
{% csrf_token %} 
<input type="submit" value="Delete" /> 
</form> 

Ama bunu nasıl bilmiyorum.

+0

Django'da nasıl silme veya düzenleme yapılacağını mı soruyorsunuz yoksa uygun bir dinlenme arabirimi mi uygulamak istiyorsunuz?Cevap bir dinlenme arayüzü için farklı olacak, en iyi üçüncü taraf paketini kullanmaktır – dkarchmer

+0

Sadece bilmek istiyorum en kolay yolu ön uçtan PUT ve DELETE göndermek için yoldur. REST çerçevesini okudum - çok ama aynı problemi anlayın - ön taraftan gelen PUT ve DELETE isteklerini nasıl anlayacağımı anlamıyorum. – Vova

+0

Verileri değiştirmek ve silmek için PUT ve DELETE kullandığınızı gerçekten okudunuz, ancak bir API geliştirmediyseniz, düzenleme ve silme görünümleri oluşturmak için uygun Django yolunu kullanabilirsiniz. Bu yüzden, anlamayacağınız kelimeleri kullanmaya çalışmak, belki de son hedefinizin ne olduğunu açıklayabilir – dkarchmer

cevap

3

HTML standard, form için geçerli yöntemler GET ve POST şeklindedir. Yani bunu <form method="delete"> gibi yapamazsın. Ancak Django, 'PUT' ve 'DELETE' (ve diğerleri) http yöntemlerini tanıtmaktadır.

from django.views.generic import View 


class TestView(View): 
    http_method_names = ['get', 'post', 'put', 'delete'] 

    def put(self, *args, **kwargs): 
     print "Hello, i'm %s!" % self.request.method 

    def delete(self, *args, **kwargs): 
     print "Hello, i'm %s!" % self.request.method 


Hello, i'm PUT! 
[06/Apr/2016 23:44:51] "PUT /de/teacher/test/ HTTP/1.1" 
Hello, i'm DELETE! 
[06/Apr/2016 23:57:15] "DELETE /de/teacher/test/ HTTP/1.1" 

PUT ve DELETE http çağrılarını ajax'ı düşünebilirsiniz. bunu bazı geçici çözümü yapabilirsiniz formu kullanmanız gerekirse:

<form action="{% url 'teacher:test' %}" method="post"> 
    {% csrf_token %} 
    <input type="hidden" name="_method" value="delete"> 
    <input type="submit" value="Delete"> 
</form> 


class TestView(View): 
    http_method_names = ['get', 'post', 'put', 'delete'] 

    def dispatch(self, *args, **kwargs): 
     method = self.request.POST.get('_method', '').lower() 
     if method == 'put': 
      return self.put(*args, **kwargs) 
     if method == 'delete': 
      return self.delete(*args, **kwargs) 
     return super(TestView, self).dispatch(*args, **kwargs) 

    def put(self, *args, **kwargs): 
     print "Hello, i'm %s!" % self.request.POST.get('_method') 

    def delete(self, *args, **kwargs): 
     print "Hello, i'm %s!" % self.request.POST.get('_method') 


Hello, i'm delete! 
[07/Apr/2016 00:10:53] "POST /de/teacher/test/ HTTP/1.1" 
Hello, i'm put! 
[07/Apr/2016 00:10:31] "POST /de/teacher/test/ HTTP/1.1" 

Gerçek PUT değil ama form ve ajax/API çağrıları için aynı arayüzü kullanabilirsiniz.

+0

Teşekkürler, bu yüzden doğru anladım - saf HTML'de PUT ve DELETE isteği göndermenin bir yolu yok mu? – Vova

+0

Tam olarak! http://www.w3schools.com/tags/att_form_method.asp – crash843

+0

Sadece bunun nasıl yorumlandığını açıklayarak, http yöntemlerini belirli görünümlerden sınırlandırdım. Birisi GET, POST veya DELETE, ancak PUT veya PATCH değil izin vermek istediğim bir görünüm var. – whoisearth

İlgili konular