![progammist](/media/cache/21/5c/215cfbe98e5a74bfb229cb290bf77d13.webp)
Как вывести статьи и профиль
Всем привет!
Вопрос такой, у меня есть мини-блог, есть статьи и профиль(страницы) пользователей.
Статьи я вывожу по адресу 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/ без дополнительных каталогов. Буду благодарен за любую помощь.
![Рекомендуем хостинг TIMEWEB](/media/technical_storage/timeweb-120-90.jpg)
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!
Пікірлер
- Unknown akadamn
- Қаң. 24, 2025, 5:14 Т.Қ.
Qt - Тест 001. Сигналы и слоты
- Нәтиже:84ұпай,
- Бағалау ұпайлары4
- Unknown akadamn
- Қаң. 24, 2025, 4:22 Т.Қ.
Qt - Тест 001. Сигналы и слоты
- Нәтиже:42ұпай,
- Бағалау ұпайлары-8
![Evgenii Legotckoi](/media/cache/5a/49/5a499b0c8eb5e79957fec0aea35e5d98.webp)
![Дмитрий](/media/cache/0a/bd/0abde19a58c2f6720c26b7b2c7a1ac5f.webp)
решение сходу не подскажу (завтра опишу мое решение когдато сделанное) НО при создании урл-ов в джанго Вы должны иметь в виду следуещее (возьмите как правило):
когда браузер запрашивает какую то страницу, джанго идет в файл урлс.пу и начинаест искать соответствие и как тока находит первое соответствие он останавливается и запускает то представление в первом найденном урле, дальше ему похер
в вашем случае браузер просит у бэка страницу, урл которой, выглядет: <домен>/<что тот>
', 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 и добавил в файл сеттингс:
будет время я обьясню код