Показывать кнопку редактирования только в сообщениях владельца - Django
У меня есть проект Django с постами и возможностью редактировать посты. На главной индексной странице я показываю все посты, как ленту новостей. В настоящее время любой может редактировать любое сообщение, но я хочу сделать так, чтобы редактировать мог только владелец сообщения. Я просто не уверен, как написать файл urls.py, поскольку я использую:
path("", views.index, name="index"),
Вероятно, мне нужно передать либо id поста, либо имя пользователя, но я не уверен, как это написать. Я пробовал:
path("index", views.index, name="index"),
path("index/<str:pk>", views.index, name="index"),
path("index/<str:username>", views.index, name="index"),
Но я получаю ошибки.
index views.py
def index(request):
list_of_posts = Post.objects.all().order_by('id').reverse()
my_session = request.user
other_user = User.objects.get(username=username)
user1 = other_user.username # other person's profile
user2 = my_session.username # myself
return render(request, "network/index.html", {
"list_of_posts": list_of_posts,
"user1": user1,
"user2": user2,
})
html для отображения кнопки редактирования. Я пробовал:
{% if user1 == user2 %}
<button class="btn-btn primary" my-id="{{i.id}}" id="ebutton-
{{i.id}}" onclick="edit_form(this)" >Edit</button>
<br><br><br>
{% endif %}
При таком способе мне нужно передать имя пользователя в url, но я не могу, не получая ошибок. В общем, я просто ищу совета, как сделать так, чтобы кнопка редактирования появлялась только в тех сообщениях, владельцем которых является текущий пользователь. Таким образом, никто не сможет редактировать чужие сообщения.
Если вы хотите показать все сообщения и разрешить редактировать только автору сообщения, вам нужно ввести все сообщения и пользователя запроса в контекст вашего шаблона. Затем в своем шаблоне перебрать все посты и проверить, что автор равен запрашиваемому пользователю, прежде чем показывать кнопку редактирования. Но сначала вам понадобится внешний ключ в модели поста, который будет ссылаться на автора.
Urls.py
urlpatterns = [path("index/", views.index, name="index")]
Виды
def index(request):
list_of_posts = Post.objects.order_by('-id')
request_user = request.user
return render(request, "network/index.html", {
"list_of_posts": list_of_posts,
"request_user": request_user
})
Модели
class Post(models.Model):
user = models.ForeignKey(User, on_delete=models.PROTECT, related_name='posts')
# Other fields
Шаблон
{% if post.user == request_user %}
<!--Show the edit button-->
{% endif %}
Вы также можете получить прямой доступ к объекту запроса в вашем шаблоне:
{% if post.user == request.user %}
<!--Show the edit button-->
{% endif %}
{% if request.user == post.author %}
<button>Delete</button>
{% endif %}
Предполагается, что у вас есть модель Post
с атрибутом author
Мне нужно было добавить {% if request.user == i.username %} потому что я выполнял цикл в html-странице, для i в get_page_num. До этого у меня не было i.