![progammist](/media/cache/21/5c/215cfbe98e5a74bfb229cb290bf77d13.webp)
progammistDec. 27, 2020, 4:29 a.m.
Как вывести статьи и профиль
Всем привет!
Вопрос такой, у меня есть мини-блог, есть статьи и профиль(страницы) пользователей.
Статьи я вывожу по адресу 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](/media/technical_storage/timeweb-120-90.jpg)
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!
Ua
- Unknown akadamn
- Jan. 24, 2025, 5:14 p.m.
Qt - Test 001. Signals and slots
- Result:84points,
- Rating points4
Ua
- Unknown akadamn
- Jan. 24, 2025, 4:22 p.m.
Qt - Test 001. Signals and slots
- Result:42points,
- Rating points-8
Last comments
ИМ
Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Игорь МаксимовNov. 22, 2024, 9:51 p.m.
![Evgenii Legotckoi](/media/cache/5a/49/5a499b0c8eb5e79957fec0aea35e5d98.webp)
Evgenii LegotckoiOct. 31, 2024, 11:37 p.m.
Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
Игорь МаксимовOct. 5, 2024, 4:51 p.m.
QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Now discuss on the forum
f
Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
firstlunoxodFeb. 15, 2025, 1:46 p.m.
![Дмитрий](/media/cache/0a/bd/0abde19a58c2f6720c26b7b2c7a1ac5f.webp)
ДмитрийFeb. 3, 2025, 4:24 p.m.
не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.
решение сходу не подскажу (завтра опишу мое решение когдато сделанное) НО при создании урл-ов в джанго Вы должны иметь в виду следуещее (возьмите как правило):
когда браузер запрашивает какую то страницу, джанго идет в файл урлс.пу и начинаест искать соответствие и как тока находит первое соответствие он останавливается и запускает то представление в первом найденном урле, дальше ему похер
в вашем случае браузер просит у бэка страницу, урл которой, выглядет: <домен>/<что тот>
', 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 и добавил в файл сеттингс:
будет время я обьясню код