Создание корневого комментария и комментариев с предками из одного представления

Я создаю систему комментариев как в twitter. Все работает хорошо с отображением твита, его предков и потомков. Основная проблема в том, что я хочу создавать корневые твиты и твиты с предками из одного и того же url (например, 'compose/tweet/). На данный момент мой код для этой задачи работает. У меня есть скрытый вход в форме со значением родительского id attr, если пользователь хочет создать ответ на твит. Attr пуст, если будет создан корневой твит.

<form action="{% url 'tweets:make_tweet' %}" method="post" novalidate>
    {% csrf_token %}
    {% render_field tweet_form.parent value=id %}
    <div class="tweet-form-textarea mb-2" id="tweet-form-textarea{{ id }}">
        {% render_field tweet_form.text class="form-control fs-5" rows="3" placeholder=placeholder %}
    </div>
    <div class="tweet-form-footer d-flex flex-row align-items-center" id="tweet-form-foote{{ id }}">
        <span class="chars-counter visually-hidden"></span>
        <input type="submit" class="make-tweet-btn fw-bold btn rounded-pill" value="Tweet">
    <div>
</form>

Форма отображается с тегом шаблона включения:

@register.inclusion_tag('tweets/tweet_form_snippet.html', takes_context=True)
def render_tweet_form(context, id=''):
    return {
        'tweet_form': context['form'],
        'id': id
    }

И наконец, значение attr заполняется в шаблоне (упрощенная версия):

{% if not tweet %}
    {% render_tweet_form %}
{% else %}
    {% render_tweet_form id=tweet.id %}
{% endif %}

Форма обрабатывается из класса:

class MakeTweetView(BaseCreateView):
    form_class = TweetForm

    def form_valid(self, form):
        tweet = form.save(commit=False)
        # Searching for value in hidden input
        parent = self.request.POST['parent']
        # If it's not empty
        if parent:
            tweet.parent_id = int(parent)
        tweet.user = self.request.user
        tweet.save()
        return super().form_valid(form)

    def get_success_url(self):
        return self.request.META.get('HTTP_REFERER', '/')

Главная проблема в том, что он никак не защищен на сервере. Пользователь может открыть веб-инспектор в браузере и изменить значение в скрытом вводе. Например, форма не имеет значения attr, что приведет к созданию корневого твита, но если я изменю значение на 5, то теперь этот твит будет ответом на твит с id=5.

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