Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Скидывает все время на последний урл [RSS Feed]

#1 Дек. 14, 2010 15:16:37

IgoPog
От:
Зарегистрирован: 2010-11-02
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Скидывает все время на последний урл

Всем привет.
Есть модели загрузки содержимого:

class A_content(model.Model)
title = .........
@permalink
def get_absolute_url(self):
return ('django.views.generic.list_detail.object_detail', None, {'object_id': self.id})

class B_content(model.Model)
title = .........
@permalink
def get_absolute_url(self):
return ('django.views.generic.list_detail.object_detail', None, {'object_id': self.id})

class C_content(model.Model)
title = .......
@permalink
def get_absolute_url(self):
return ('django.views.generic.list_detail.object_detail', None, {'object_id': self.id})
Написал форму поиска:

#views.py
def search(request, model):
error = False
query = request.GET.get('q', '')
if query:
qset = (
Q(title__icontains=query)
)
results = model.objects.filter(qset).select_related().distinct()
#query = model.objects.all().select_related()
#results = model.objects.all().select_related()
else:
#results = []
return render_to_response('search.html', {'error' : True})
return render_to_response("search.html", {
"results": results,
"query": query
})
Как в документации.
Теперь гвоздь программы:
#urls.py:

from django.views.generic.list_detail import object_list, object_detail
from MyApp.models import A_content, B_content, C_content

create_info_a = {'model': A_content}
display_info_a = {'queryset': A_content.objects.all()}

create_info_b = {'model': B_content}
display_info_b = {'queryset': B_content.objects.all()}

create_info_c = {'model': C_content}
display_info_c = {'queryset': C_content.objects.all()}

urlpatterns = patterns('',
url(r'^search/a_search/$', 'MyProj.MyApp.views.search',
{'model': A_content}),
url(r'^search/a_search/$', 'MyProj.MyApp.views.search',
{'model': B_content}),
url(r'^search/a_search/$', 'MyProj.MyApp.views.search',
{'model': С_content}),

url(r'^search/a_search/(?P<object_id>\d+)/$', object_detail,
display_info_a),
url(r'^search/b_search/(?P<object_id>\d+)/$', object_detail,
display_info_b),
url(r'^search/c_search/(?P<object_id>\d+)/$', object_detail,
display_info_c),
Так вот, прикол в том, что когда я нахожу любой объект, к примеру класса А, и нажимаю на него, чтоб детально посмотреть, урл перебрасывается на детализацию объекта класса С, причем с тем же id что у кликнутого объекта класса А. С объектами класса B таже фигня - скидывается на С. Будто как у Штирлица, запоминается последнее. Если закаментовать строчку детализации объектов С (Т.е. эту
url(r'^search/c_search/(?P<object_id>\d+)/$', object_detail, display_info_c),
) то все тоже самое, но теперь все будет перекидываться на объекты класса В.
Я не могу понять, как исправить! Хочу посмотреть один объект, а выкидывает на другой.
Есть у кого соображения?

P.S. Извините, что такая простыня, но мало ли в коде налажал.



Отредактировано (Дек. 14, 2010 15:21:36)

Офлайн

#2 Дек. 14, 2010 15:22:52

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Скидывает все время на последний урл

Как вы хотите чтобы работал реверсинг, если у вас все урлы одинаковые – одна и тажа вьюха к ним привязана. Понятно дело, что он находит первый попавшыйся (идет с конца) урл и в не него подставляет параметры.

Дайте своим урлам разные имена явным образом.



Офлайн

#3 Дек. 14, 2010 15:34:32

IgoPog
От:
Зарегистрирован: 2010-11-02
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Скидывает все время на последний урл

Александр Кошелев
Извините, опечатка. В урлах:

urlpatterns = patterns('', 
url(r'^search/a_search/$', 'MyProj.MyApp.views.search',
{'model': A_content}),
url(r'^search/b_search/$', 'MyProj.MyApp.views.search',
{'model': B_content}),
url(r'^search/c_search/$', 'MyProj.MyApp.views.search',
{'model': С_content}),

url(r'^search/a_search/(?P<object_id>\d+)/$', object_detail,
display_info_a),
url(r'^search/b_search/(?P<object_id>\d+)/$', object_detail,
display_info_b),
url(r'^search/c_search/(?P<object_id>\d+)/$', object_detail,
display_info_c),
а вьюха универсальная ж. Ищет что спрашивает, возвращает объект. А вот потом чудеса и начинаются.



Офлайн

#4 Дек. 14, 2010 15:44:18

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Скидывает все время на последний урл

IgoPog
Извините, опечатка. В урлах:
Ничего не изменилось.

IgoPog
а вьюха универсальная ж.
Так в этом и проблема. Как ему их отличать?

Дайте уникальные имена (name) урлам.



Офлайн

#5 Дек. 14, 2010 15:49:21

IgoPog
От:
Зарегистрирован: 2010-11-02
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Скидывает все время на последний урл

Александр Кошелев
Я прошу прощения. Видимо затупляю. А почему имена урлов не уникальные? Разве “search/A/id=5” и “search/C/id=5” это одно и тоже?
Если не сложно, напишите пример, как Вы советуете сделать, а то я как то не пойму.



Офлайн

#6 Дек. 15, 2010 11:05:36

IgoPog
От:
Зарегистрирован: 2010-11-02
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Скидывает все время на последний урл

Может кто-нибудь таки подскажет по-предметнее?



Офлайн

#7 Дек. 15, 2010 11:07:52

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Скидывает все время на последний урл

Офлайн

#8 Дек. 15, 2010 11:09:22

IgoPog
От:
Зарегистрирован: 2010-11-02
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Скидывает все время на последний урл

Александр Кошелев
Спасибо. Понял, что Вы имели ввиду. Попробую.
Сорри, за затупление…



Офлайн

#9 Дек. 15, 2010 14:52:16

IgoPog
От:
Зарегистрирован: 2010-11-02
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Скидывает все время на последний урл

Сделал так:

url(r'^search/b_search/(?P<object_id>\d+)/$', object_detail,
display_info_b, name="b-search"),
url(r'^search/c_search/(?P<object_id>\d+)/$', object_detail,
display_info_c, name="c-search"),
А в модели надо поменять:
class B_content(model.Model)
title = .........

@permalink
def get_absolute_url(self):
return ('b-search', [str(self.id)])
Ссылка: http://docs.djangoproject.com/en/dev/ref/models/instances/#django.db.models.permalink

Александр Кошелев
Еще раз, спасибо



Офлайн

  • Начало
  • » Django
  • » Скидывает все время на последний урл[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version