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
.
читайте больше о том, как выполняется валидация в формах здесь и вы можете использовать то же самое для добавления собственной валидации в ваши модели.