Показывать кнопку редактирования только в сообщениях владельца - 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.

Вернуться на верх