Django - как проверить данные из сообщения, которое не находится в форме django?

Я получаю данные для постов из моего шаблона, но они создаются с помощью js, это не форма django. Я знаю, что если я размещаю поле с помощью формы django, я могу использовать form.is_valid() или x = form.cleaned_data['field'], но я не знаю, как валидировать/очистить мои данные, когда не используется форма django. Причина, по которой я использую js для этой формы/шаблона, заключается в том, чтобы получить специфический вид, который я не могу сделать с помощью стандартного шаблона/формы django.

models.py

class AssessComment(models.Model):
    assessment = models.ForeignKey(Assessment, on_delete=models.CASCADE)
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    comment = models.TextField(blank=True)

js snippet

// this js is appended to the grade-form element in the template
document.getElementById('grade-form').appendChild(table);
comment = document.createElement('td');
commentName = "row-" + n + "-comment";
commentText = document.createElement("textarea");
commentText.setAttribute("name", commentName);
rowName[n].appendChild(comment);
comment.appendChild(commentText);

Приведенный выше js помещает textarea в таблицу и дает ей имя commentName. Шаблон отправляет это как сообщение в мое представление. Я перебираю несколько строк n.

шаблон

div class="form-group">
  <form action="" method="post">{% csrf_token %}
    <div id="grade-form"></div> <!-- js is inserted here -->
      <div class="form-group">
        <button type="submit" class="btn btn-primary">Submit</button>
      </div>
  </form>
</div>

views.py

while s < len(cs):
    comment = "row-" + str(s) + "-comment"
    form_comment = request.POST[comment] # this gets the commentName element
    new_comment = AssessComment()
    new_comment.comment = form_comment
    new_comment.assessment = this_assessment
    new_comment.student = student_list[s]
    comment_list.append(new_comment)
    s+=1
AssessComment.objects.bulk_create(comment_list)

Этот код работает как задумано. Пользователь вводит текст в текстовую область, и когда форма отправляется, создаются новые объекты AssessComment с соответствующими полями. Однако я не делаю никакой валидации или очистки. Я не знаю, насколько это важно, я не знаю, какая валидация вообще выполняется для TextField. Если бы это было не текстовое поле, а поле электронной почты, я бы понял, насколько это важно. Интересно, помогает ли валидация текстового поля предотвратить вредоносный код, что было бы очень важно. Возможно, я мог бы переписать весь этот код, чтобы не использовать javascript. С тех пор как я впервые написал этот код, я думаю, что, возможно, придумал способ реализовать эту форму без использования js. Сказав все это, я все еще хотел бы знать, как проверить поле form_comment.

Вы можете создать форму с любыми полями, и пока ваша форма JavaScript, которую вы будете отображать на странице, отправляет правильные данные, вы можете проверять форму как обычно, как если бы она была отправлена {{ form }} в шаблоне, только убедитесь, что имя текстового поля совпадает с тем, которое было бы дано {{ form }}, если бы оно было использовано вместо него.

# forms.py
class AssessCommentForm(forms.ModelForm):
    class Meta:
        model = AssessComment
        fields = ['comment',]

Пока request.POST будет давать то же имя, которое было бы отправлено формой, созданной с помощью {{ form }}, AssessCommentForm не будет знать или заботиться о том, что оно пришло из JavaScript.

# views.py
form = AssessCommentForm(request.POST or None)
if form.is_valid():
    # process form

Я уверен, что существуют способы проверки одного поля, но боюсь, что я пока не знаю, как это сделать.

Вы можете просто проверить поле на уровне модели примерно так:

from django.core.exceptions import ValidationError

def validate_special_characters(value):
  if ['$', '/', '#'] in value:
     raise ValidationError("Special characters not allowed")          
  else:
     return value

class AssessComment(models.Model):
    assessment = models.ForeignKey(Assessment, on_delete=models.CASCADE)
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    comment = models.TextField(blank=True, validators=[validate_special_characters])

, который вызовет исключение, если в сохраняемом комментарии присутствуют указанные специальные символы. Аналогичным образом вы можете добавить дополнительные проверки с помощью значений, разделенных запятыми в validators.

читайте больше о том, как выполняется валидация в формах здесь и вы можете использовать то же самое для добавления собственной валидации в ваши модели.

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