填写FormMixin表单

问题描述 投票:0回答:1

是否可以在不将表单变量传递给模板的情况下填充 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()

django django-forms django-templates
1个回答
0
投票

您正在手动渲染字段,因此您还需要注意包含这些字段的初始值。例如对于

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 %}
© www.soinside.com 2019 - 2024. All rights reserved.