Создание корневого комментария и комментариев с предками из одного представления
Я создаю систему комментариев как в 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.