Как вывести статьи и профиль
Всем привет!
Вопрос такой, у меня есть мини-блог, есть статьи и профиль(страницы) пользователей.
Статьи я вывожу по адресу 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/ без дополнительных каталогов. Буду благодарен за любую помощь.
3
100
Do you like it? Share on social networks!
- Last comments
- AKApril 1, 2025, 11:41 a.m.Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- VPMarch 9, 2025, 4:14 p.m.Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМNov. 22, 2024, 9:51 p.m.Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Now discuss on the forum
- МАApril 1, 2025, 4:21 p.m.0ff763fe-4e50-455d-a3a6-5699c243b1a5_17_44_22_1.xml
- fFeb. 15, 2025, 1:46 p.m.Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
решение сходу не подскажу (завтра опишу мое решение когдато сделанное) НО при создании урл-ов в джанго Вы должны иметь в виду следуещее (возьмите как правило):
когда браузер запрашивает какую то страницу, джанго идет в файл урлс.пу и начинаест искать соответствие и как тока находит первое соответствие он останавливается и запускает то представление в первом найденном урле, дальше ему похер
в вашем случае браузер просит у бэка страницу, урл которой, выглядет: <домен>/<что тот>
', 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 и добавил в файл сеттингс:
будет время я обьясню код