я наткнулся на очень своеобразном проблемы с 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
, который, конечно, неправильно, так что скрипт не получит любые данные и ничего не будут изменять (он просто оставляет ВСЕ данные в раскрывающемся списке).
Так что мой вопрос: почему это происходит и как я могу это исправить? Как я могу заставить этот скрипт работать как в версиях, так и в вставках?
Вот что я подумал, но в этом случае полный адрес ajax при вставке должен быть/app/insert/insert_ajax, но это не тот случай - это/app/insert_ajax, поэтому он озадачивает меня. ПОЧЕМУ он добавляет insert_ajax на конец издания. Я упоминал, что все представления находятся в одном файле? Что-то меняет? Кроме того, я попытался просто указать полный URL-адрес приложения, а не просто имя django, но он просто добавляет весь адрес к URL-адресу издания ... –
Это происходит потому, что в отличие от URL-адреса редактирования другие URL-адреса _DO NOT_ заканчиваются на '/' , Когда URL-адреса не заканчиваются косой чертой, текущая страница (последняя часть URL-адреса) заменяется на 'insert_ajax'. Избегайте смешивания окончаний url косой черты. – v1k45
Я предполагаю, что это имеет смысл. Но есть эта проблема, что число фактически является идентификационным номером элемента из базы данных. Теперь я думаю, как это исправить, поскольку первый запуск с методом get, поэтому данные должны быть как-то отправлены/обработаны/отображены. –