Как вывести статьи и профиль
Всем привет!
Вопрос такой, у меня есть мини-блог, есть статьи и профиль(страницы) пользователей.
Статьи я вывожу по адресу site/названиестатьи
Кабинет пользователя я хочу вывести по адресу site/юзернейм
views.py (статьей):
def post_detail(request, slug): post = get_object_or_404(Post, slug=slug) return render(request, 'post_detail.html', {'post': post })
views.py (пользователей):
class UserProfileView(DetailView): template_name = 'users/profile/profile-user-view.html' queryset = User.objects.all() def get_object(self): username = self.kwargs.get("username") return get_object_or_404(User, username=username)
URL's:
path('<str:username>', UserProfileView.as_view(), name='user_detail') path('<slug:slug>', views.post_detail, name='post_detail')
Сейчас у меня открывается профиль пользователя по адресу site/юзернейм, но не открывается статья по адресу site/названиестатьи. Ошибка:
Page not found (404) Request URL: http://127.0.0.1:8000/testarcticle Raised by: users.views.UserProfileView No User matches the given query.
Подозреваю какой-то конфлитк в урл (slug). Как мне сделать так, чтобы откывалось и статьи и кабинет по адресу site/ без дополнительных каталогов. Буду благодарен за любую помощь.
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.Do you like it? Share on social networks!
- Akiv Doros
- Nov. 11, 2024, 2:58 p.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:50points,
- Rating points-4
- molni99
- Oct. 26, 2024, 1:37 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:80points,
- Rating points4
- molni99
- Oct. 26, 2024, 1:29 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:20points,
- Rating points-10
решение сходу не подскажу (завтра опишу мое решение когдато сделанное) НО при создании урл-ов в джанго Вы должны иметь в виду следуещее (возьмите как правило):
когда браузер запрашивает какую то страницу, джанго идет в файл урлс.пу и начинаест искать соответствие и как тока находит первое соответствие он останавливается и запускает то представление в первом найденном урле, дальше ему похер
в вашем случае браузер просит у бэка страницу, урл которой, выглядет: <домен>/<что тот>
', UserProfileView.as_view(), name='user_detail') идет первым, джанго находит его и отдает представление UserProfileView браузеру
у вас два path-а которые, соответствуют данному шаблону, НО, этот: path('
теперь вы как кодер знаете что у вас есть 2 разных урла - типа разных, джанго пофиг что они разные
если вы в виде экперимета поменяете местами эти 2 path-а, то при запросе типа <домен>/<что тот>, будет выполнятся path('
', views.post_detail, name='post_detail') и не важно что вы запросите профиль или статейку он все равно попытается обратится к представлению post_detail а представление UserProfileView будет игнорированно!
Спасибо, я понял намёк, что надо выразить проверку в одном представлении, и проверять по одному урлу, но не знаю как выразить это в синтаксисе
Кажется, разобрался:
Url:
я бы сделал site/a/article_name и site/u/username - куда проще и лишних запросов не делать
плюс логика относительно каждого запроса изолированна
предаставим, что по бизнес-логике url должно быть именно site/article и site/username, как бы вы поступили?)
ну я бы постарался убедить бизнес, что так делать - не очень и с точки зрения всякого seo и с точки зрения консистентности данных. Что это накладывает ненужные ограничения и на article и на username (слабо связанные сущности начинают оч плотно зависеть друг от друга и накладывать ограничения - чистая архитектура вышла из чата)
плюс начинаются проблемы, если на этих страницах есть формы (допустим, на странице профиля форма его изменения, а на странице статьи - форма комментария) - представление становится слишком большим и выполнять слишком много (SOLID и KISS - вышли вслед за архитектурой)
ну и самая засада начнется, если придется делать разные вложенные страницы - вот тогда будет прям больно: site/ profile /edit + site/ atricle /edit
в этом плане, мне кажется, было бы куда проще сделать так:
НО, из академического интереса, я бы сделал так:
разделил обработку каждой страницы через helper функцию
я бы сделал так потому, что:
1) поле slug создается с индексом и искать через filter по нему - очень быстро и не накладно
2) post_page_view и profile_page_view - устроены точно как представления, так что в случае чего их можно будет легко изолировать с минимумом изменений
3) передавал бы найденные объекты внутрь "представлений", чтобы не делать доп запросов
Спасибо за развернутый ответ, изменил по вашему примеру:
views.py
URL:
На страницу юзера заходит без проблем, но на страницу статьи, почему-то 404. В чем может быть дело?
потому что в post_page_view и profile_page_view вы передаете уже объект
надо:
Спасибо!
как и обещал, я опишу некогда решоную мной задачу, немного похоже на Вашу с урлами.
надо было создать меню, у урлы для меню должны были выглядеть <домен>/<слаг>
я создал прилажуху pages, в этой прилажухи была одна модель:
как видно, некоторые страницы были доступны только авторизованным пользователям.
пыть к любой странице данной модели вот такой:
path('
', get_page, name="page"),
дальше в краце:
1. создал middleware.py и добавил в файл сеттингс:
будет время я обьясню код