[Исходное сообщение]
Я хочу, чтобы пользователи получали доступ к сообщениям, используя значение PK или Slug. Я могу заставить http://localhost: 8000 / должность / 8 / работать, но не http://localhost: 8000 / должность / работа в Малайзии / .
Я просмотрел несколько сообщений о переполнении стека, но я не хочу http://localhost: 8000 / post / 8 / working-in-malaysia . И я не хочу, чтобы это касалось работы ПК. Или слизняк работает. Я хочу, чтобы пользователь мог войти либо.
Ниже вы можете увидеть мои неудачные попытки.
urls.py
path('post/<int:pk>/', views.post_detail, name='post-detail'),
#path('post/<slug:the_slug>/', views.post_detail, name='post-detail-slug'),
#path('post/<slug:slug>/', views.post_detail, name='post-detail-slug'),
#path('post/(?P<slug>[-\w]+)/$', views.post_detail, name='post-detail-slug'),
path('<slug:slug>', views.post_detail, name='post-detail-slug'),
[Обновления после просмотра комментариев Дэниела Морелла]
views.py
class PostDetailView(DetailView):
model = Post
def dispatch(pk_slug):
if pk_slug.isdigit():
post = Post.objects.filter(id=pk_slug).first()
else:
post = Post.objects.filter(slug=pk_slug).first()
#post = get_object_or_404(Post)
comments = post.comments.filter(active=True, slug=slug)
new_comment = None
if request.method == 'POST':
comment_form = CommentForm(data=request.POST)
if comment_form.is_valid():
new_comment = comment_form.save(commit=False)
new_comment.post = post
new_comment.save()
else:
comment_form = CommentForm()
return render(request, post_detail.html, {'post': post,
'comments': comments,
'new_comment': new_comment,
'comment_form': comment_form})
urls.py
path('', PostListView.as_view(), name='blog-home'),
path('post/<slug:pk_slug>', views.post_detail, name='post-detail'),
path('post/new/', PostCreateView.as_view(), name='post-create'),
models.py
def get_absolute_url(self):
#return reverse('article_detail', kwargs={'slug': self.slug})
return reverse('post-detail', kwargs={'pk': self.pk})
[Обновления после просмотра Даниэля Морелла 2-й лот комментариев]
views.py
pk_slug = self.kwargs.get(self.slug_url_kwarg)
# If the pk_slug is not None and it is just digits treat as pk
# Otherwise if it is not None treat as slug
if pk_slug is not None and pk_slug.isdigit():
queryset = queryset.filter(pk=pk_slug)
else pk_slug is not None:
slug_field = self.get_slug_field()
queryset = queryset.filter(**{slug_field: pk_slug})
Командная строка
File "C:\Users\HP\django_project3\blog\views.py", line 55
else pk_slug is not None:
^
SyntaxError: invalid syntax
[Проблема решена]
По неизвестным причинам у меня были FBV (представление на основе функций) и CBV (представление на основе классов) с похожим кодом. Оригинальное предложение Даниэля Морелла сработало в предположении, что я использую FBV.
Я, к сожалению, потратил впустую его время, показав ему свой код с CBV. Что означало, что он переписал свое решение. Затем я обнаружил, что код FBV является избыточным, а код CBV - правильным.
Ниже мой последний набор кода. Эта ссылка на оригинальное предложение Дэниела Морелла - { ссылка }.
Я новичок с Python и даже не знал, что вчера означало аббревиатура CBV.
views.py
def post_detail(request, pk_slug):
template_name = 'post_detail.html'
if pk_slug.isdigit():
post = Post.objects.filter(id=pk_slug).first()
else:
post = Post.objects.filter(url=pk_slug).first()
comments = Comment.objects.filter(post=post.id ,active=True)
#post = Post.objects.get(pk=pk)
new_comment = None
# Comment posted
if request.method == 'POST':
comment_form = CommentForm(data=request.POST)
if comment_form.is_valid():
# Create Comment object but don't save to database yet
new_comment = comment_form.save(commit=False)
# Assign the current post to the comment
new_comment.post = post
# Save the comment to the database
new_comment.save()
else:
comment_form = CommentForm()
return render(request, template_name, {'post': post,
'comments': comments,
'new_comment': new_comment,
'comment_form': comment_form})
urls.py
path('post/<slug:pk_slug>/', views.post_detail, name='post-detail'),