Редактируемые комментарии django blog
У меня проблемы с редактированием моих комментариев. Они работают нормально, если я оставляю их нередактируемыми, но я хочу, чтобы они были редактируемыми. Я думаю, что это как-то связано с первичными ключами, но я не совсем понимаю, как это сделать. Ранее я мог редактировать комментарии, но всегда редактировался последний комментарий.
Вот мой код:
models.py
class Tee_times(models.Model):
viable_courses = [
("Eslövs GK","Eslövs GK"),
("Lunds Akademiska GK","Lunds Akademiska GK"),
("Söderåsens GK","Söderåsens GK")
]
title = models.CharField(max_length=100, choices=viable_courses, default=1)
content = models.TextField()
pub_date = models.DateTimeField(auto_now_add=True)
player = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse("post-detail", kwargs={"pk": self.pk})
class Comment(models.Model):
text = models.CharField(max_length=200, default="Write a comment")
tee_time = models.ForeignKey(Tee_times, related_name="comments", on_delete=models.CASCADE)
pub_date = models.DateTimeField(auto_now_add=True)
player = models.ForeignKey(User, on_delete=models.CASCADE)
class Meta:
ordering = ("pub_date",)
def __str__(self):
return f"{self.player} - {self.pub_date}"
def get_absolute_url(self):
return reverse("post-detail", kwargs={"pk": self.tee_time.pk})
def set_time(self):
self.pub_date = models.DateTimeField(auto_now_add=True)
urls.py
urlpatterns = [
path('', TeeListView.as_view(), name="index"),
path('post/<int:pk>/', DetailTeeView.as_view(), name="post-detail"),
path('post/<int:pk>/comment/new/', CommentCreateView.as_view(), name="comment-create"),
path('post/<int:pk>/comment/<int:pkc>/update/', CommentUpdateView.as_view(), name="comment-update"),
path('post/<int:pk>/comment/<int:pkc>/delete/', CommentDeleteView.as_view(), name="comment-delete"),
path('post/new/', TeeCreateView.as_view(), name="post-create"),
path('post/<int:pk>/update/', TeeUpdateView.as_view(), name="post-update"),
path('post/<int:pk>/delete/', TeeDeleteView.as_view(), name="post-delete"),
path("second/", views.second, name="second"),
path("register/", user_views.register, name="Register")
]
views.py
```
class TeeListView(ListView):
model = Tee_times
template_name = "testapp/index.html"
context_object_name = "posts"
ordering = ["-pub_date"]
class DetailTeeView(DetailView):
model = Tee_times
class TeeCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateView):
model = Tee_times
fields = ["title",
"content"]
success_message = "New Tee Time Created!"
def form_valid(self, form):
form.instance.player = self.request.user
return super().form_valid(form)
class TeeDeleteView(LoginRequiredMixin, UserPassesTestMixin, SuccessMessageMixin, DeleteView):
model = Tee_times
success_url = "/"
success_message = f"The tee time was successfully deleted!"
def test_func(self):
tee_time = self.get_object()
if self.request.user == tee_time.player:
return True
else:
return False
class TeeUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Tee_times
fields = ["title",
"content"]
def form_valid(self, form):
form.instance.player = self.request.user
return super().form_valid(form)
# goes through userpassestexstmixin
def test_func(self):
tee_time = self.get_object()
if self.request.user == tee_time.player:
return True
else:
return False
class CommentCreateView(CreateView):
model = Comment
fields = ["text"]
def form_valid(self, form):
form.instance.tee_time_id = self.kwargs["pk"]
form.instance.player = self.request.user
return super().form_valid(form)
class CommentDeleteView(LoginRequiredMixin, UserPassesTestMixin, SuccessMessageMixin, DeleteView):
model = Comment
success_url = "/"
success_message = f"The comment was successfully deleted!"
def test_func(self):
comment = self.get_object()
if self.request.user == comment.player:
return True
else:
return False
class CommentUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Comment
fields = ["text"]
def form_valid(self, form):
form.instance.tee_time_id = self.kwargs["pk"]
form.instance.player = self.request.user
return super().form_valid(form)
# goes through userpassestexstmixin
def test_func(self):
comment = self.get_object()
if self.request.user == comment.player:
return True
else:
return False
В вашем urls.py
path('post/<int:pk>/comment/<int:pkc>/update/', CommentUpdateView.as_view(), name="comment-update"),
path('post/<int:pk>/comment/<int:pkc>/delete/', CommentDeleteView.as_view(), name="comment-delete"),
Вы увидите, что для каждого из них требуется две переменные, pk и pkc. Однако при создании URLS у вас есть только одна переменная, comment.id
{% if comment.player == user %}
<a class="btn btn-secondary btn-sm mt-1 mb-1" href="{% url 'comment-update' comment.id %}">Update</a>
<a class="btn btn-danger btn-sm mt-1 mb-1" href="{% url 'comment-delete' comment.id %}">Delete</a>
{% endif %}
Вам нужно включить вторую переменную, pk для поста, чтобы URL совпадали, например
{% url 'comment-update' object.id comment.id %}