是否可以在不将表单变量传递给模板的情况下填充 FormMixin 表单数据?我有一个模板,但我不明白如何用Django创建表单,所以我只是在模板中指定name属性。表单已创建,一切都很好,我重写了该方法
get_initial() 方法,但表单未填写 可以这样做还是需要传递表单变量?
class CommentEditView(View, FormMixin):
form_class = EditCommentForm
def get_initial(self):
initial = super().get_initial()
comment = get_object_or_404(Comment, pk=15)
initial['review_text'] = comment.review_text
initial['grade'] = comment.grade
return initial
def get(self, request, comment_id):
return render(request, 'catalog/review-edit.html')
class EditCommentForm(ModelForm):
class Meta:
model = Comment
fields = ['review_text', 'grade']
<form method="POST">
{% csrf_token %}
<textarea class="product-detail-reviews-textarea" name="review_text" id="id_review_text"></textarea>
{% for error in form.review_text.errors %}
<p class="product-detail-reviews-error">* {{ error }} </p>
{% endfor %}
<div class="product-detail-reviews-row">
<div class="product-detail-reviews-stars">
<p>Stars:</p>
<div class="rating-area">
<input type="radio" id="id_grade_five" name="grade" value="5">
<label for="id_grade_five" title="Star «5»"></label>
<input type="radio" id="id_grade_four" name="grade" value="4">
<label for="id_grade_four" title="Star «4»"></label>
<input type="radio" id="id_grade_three" name="grade" value="3">
<label for="id_grade_three" title="Star «3»"></label>
<input type="radio" id="id_grade_two" name="grade" value="2">
<label for="id_grade_two" title="Star «2»"></label>
<input type="radio" id="id_grade_one" name="grade" value="1">
<label for="id_grade_one" title="Star «1»"></label>
</div>
</div>
<button type="submit" class="product-detail-reviews-link">Confirm</a>
</div>
{% for error in form.grade.errors %}
<p class="product-detail-reviews-error">*{{ error }} </p>
{% endfor %}
</form>
重写方法 get_initial()
您正在手动渲染字段,因此您还需要注意包含这些字段的初始值。例如对于
review_text
<textarea class="product-detail-reviews-textarea" name="review_text" id="id_review_text">{{ form.review_text.initial }}</textarea>
如果您只想向表单元素添加一些 CSS 类,则最好使用此处所述的小部件或此处描述的 Meta 表单来声明它们。例如:
class EditCommentForm(ModelForm):
class Meta:
model = Comment
fields = ["review_text", "grade"]
widgets = {"review_text": Textarea(attrs={"class": "product-detail-reviews-textarea"})}
这样,你就可以让 django 完成大部分渲染工作:
{{ form.review_text }}
{% for error in form.review_text.errors %}
<p class="product-detail-reviews-error">* {{ error }} </p>
{% endfor %}