2016-03-24 3 views
0

я наткнулся на очень своеобразном проблемы с Django и JQuery/Ajax Есть адреса в URL-адресов:Django и Ajax проблемы с адресом POST

url(r'^app/insert$', Insert.as_view(), name="insert"), 
url(r'^app/insert_ajax$', Insert_Ajax.as_view(), name="insert_ajax"), 
url(r'^app/edit/(?P<id>\d+)/$', Edit.as_view(), name="edit"), 

Как вы можете видеть, они все приписанные на основе просмотров , Существует также модель:

class TheModel(models.Model): 
    item = models.ForeignKey(AnotherModel, related_name="anotherModel") 
    attribute = models.ForeignKey(ListOfAttributes, related_name="attributes", blank=True) 

и форма, основанная на данной модели:

class TheModelForm(forms.ModelForm): 
    class Meta: 
     model = TheModel 

Так дело в том, что атрибут должен изменить (фильтр) в соответствии с данным пунктом. Существует JQuery, который обрабатывает, что:

var change_attribute = function(){ 

    var selected_item_id = $("#selected_item_id").val(); 
    $.post("insert_ajax",{"method":"get_attributes","item":$("#id_item").val()}, function(data) { 
     $("#id_attributes").empty(); 
     $.each(data,function(index, value){ 
      if(value['id'] == selected_item_id){ 
       $("#id_attributes").append("<option selected='selected' value='"+ value['id'] +"'>"+value['name']+"</option>"); 
      }else{ 
       $("#id_attributes").append("<option value='"+ value['id'] +"'>"+value['name']+"</option>"); 
      } 
     }); 
    }); 

} 

И это идет прямо к Ajax зрения:

class CallDropAjax(View): 

    def post(self, request): 
     method = request.POST.get('method', None) 
     context = {} 
     if method: 
      try: 
       context = getattr(self, method)(request) 
      except AttributeError as e: 
       context = json.dumps({'success': False, 
             'error': 'Method %s cannot be called due to %s.' % (method, 
                          str(e))}) 
     else: 
      context = json.dumps({'success': False, 
            'error': 'No method specified'}) 

     return HttpResponse(context, content_type="json/application") 

    def get_attributes(self, request): 
     attributes = ListOfAttributes.objects.filter(
      item__id=request.POST.get('item')) 
     json_op = [] 
     for attribute in attributes: 
      json_op.append({"id": attribute.id, 
          "name": attribute.name}) 
     return json.dumps(json_op) 

Тот же сценарий JQuery используется в обоих вставки и редактирования представлений/формы, но она работает только для вставки, а не для издания. Когда я посмотрел в данных, встраивание правильно запрашивает у сервера

http://the_server/app/insert_ajax 

поэтому сервер отвечает, и выпадающий список для атрибутов фильтруются и соответствующим образом изменен. Но в издании его просмотр не работает, и когда я посмотрел на то, что Ajax запрашивает сервер для, он вышел, как это:

http://the_server/app/edit/2453/insert_ajax 

, который, конечно, неправильно, так что скрипт не получит любые данные и ничего не будут изменять (он просто оставляет ВСЕ данные в раскрывающемся списке).

Так что мой вопрос: почему это происходит и как я могу это исправить? Как я могу заставить этот скрипт работать как в версиях, так и в вставках?

ответ

1

Я решил это!

я должен был изменить urls.py и добавить еще одну строку:

url(r'^app/insert$', Insert.as_view(), name="insert"), 
url(r'^app/insert_ajax$', Insert_Ajax.as_view(), name="insert_ajax"), 
url(r'^app/edit/(?P<id>\d+)$', Edit.as_view(), name="edit"), 
url(r'^app/edit/insert_ajax$', Insert_Ajax.as_view(), name="insert_insert_ajax"), 

Так что теперь сценарий может быть вызван в пределах редактирования, и он будет найти путь обратно в тот же вид обработчика Insert_Ajax.

Кроме того, я должен был изменить сценарий JQuery, так что он работает ОБА звонки - к insert_ajax и insert_insert_ajax:

var post_change = function(){ 

    var selected_id = $("#selected_id").val(); 
    $.post("insert_ajax",{"method":"get_attributes","item":$("#id_item").val()}, change_item); 
    $.post("insert_edit_ajax",{"method":"get_attributes","item":$("#id_item").val()}, change_item); 
} 

и выбросить обработчик ответа на другую функцию «change_item» (так я не

И это работает! Не очень элегантное решение с этими избыточными вызовами обоих взглядов, надеясь, что один из них ответит, но на данный момент это будет возможно. Возможно, я изменю это позже, когда я узнаю, как проверить, был ли URL-адрес успешным.

1

Предполагаю, что /app/edit/2453/ является видимым URL-адресом.

Когда вы редактируете содержимое с этого /app/edit/2453/, JQuery запускает запрос AJAX POST на url + insert_ajax.

Смотрите эту строку:

$.post("insert_ajax",{"method":"get_attributes","item...... 

Вы можете исправить поведение, заменив "insert_ajax" с полной относительной URL (/app/edit/2453/) для страницы редактирования.

+0

Вот что я подумал, но в этом случае полный адрес ajax при вставке должен быть/app/insert/insert_ajax, но это не тот случай - это/app/insert_ajax, поэтому он озадачивает меня. ПОЧЕМУ он добавляет insert_ajax на конец издания. Я упоминал, что все представления находятся в одном файле? Что-то меняет? Кроме того, я попытался просто указать полный URL-адрес приложения, а не просто имя django, но он просто добавляет весь адрес к URL-адресу издания ... –

+1

Это происходит потому, что в отличие от URL-адреса редактирования другие URL-адреса _DO NOT_ заканчиваются на '/' , Когда URL-адреса не заканчиваются косой чертой, текущая страница (последняя часть URL-адреса) заменяется на 'insert_ajax'. Избегайте смешивания окончаний url косой черты. – v1k45

+0

Я предполагаю, что это имеет смысл. Но есть эта проблема, что число фактически является идентификационным номером элемента из базы данных. Теперь я думаю, как это исправить, поскольку первый запуск с методом get, поэтому данные должны быть как-то отправлены/обработаны/отображены. –

Смежные вопросы