【问题标题】:How to concatenate form key/values to string and assign it to Django variable?如何将表单键/值连接到字符串并将其分配给 Django 变量?
【发布时间】:2019-09-23 04:44:39
【问题描述】:

Web 开发 Django 和 python 新手。

有一个带有文本框的评论页面,客户在其中写下他们对工厂参观的评论。单击提交时,它以文本文件的形式发送到经理邮件。

我的雇主希望它更像调查页面,因此他们要求将文本框输入更改为基于表单的输入,其中客户提供了多个标签和输入,如下所示。单击提交时,应创建一个包含以下信息的文本文件并作为邮件发送。

Name : 

Phone :

email :

precaution and safety gears given: [yes/no]

Unit 1 ambience: [Very satisfied/Satisfied/Neutral/Unsatisfied/Very unsatisfied]

Unit 2 ambience: [Very satisfied/Satisfied/Neutral/Unsatisfied/Very unsatisfied]

Unit 3 ambience: [Very satisfied/Satisfied/Neutral/Unsatisfied/Very unsatisfied]

General feedback : /text box for detailed review if any/

[] 中给出的值是下拉值。

我们的网站建立在 Django 框架上。以下是评论页面使用的模板文件。

{% extends 'page1.tmpl' %}
    <form id="reviewform" method="post" action="/sjfacweb/revfile/save">
        <pre><textarea name="review" id="review">{{ review }}</textarea></pre>
        <input class="button" type="submit" name="submit" value="Save" />
    </form>
{% endblock content %}

views.py

@require_POST
@csrf_protect
def revfile_save(request):
   """
   This page processes and saves review file.
   """
   review = request.POST.get('review', "").replace('\r\n','\n')
   reviewfile_name = "/root/sjfacweb/" + remote.sjfacweb()
   remote.write_reviewfile(reviewfile_name,False,review)

我认为 django 变量 'review' 捕获了客户输入的整个字符串并将其保存为文件。

假设模板如下所示,

{% extends 'page1.tmpl' %}
    <form id="reviewform" method="post" action="/sjfacweb/revfile/save">
        Name: <input type="text" name="Name" value=""><br>
        Phone: <input type="text" name="Phone" value=""><br>
        email: <input type="email" name="email" value=""><br> 
        precaution and safety gears given: 
        <select>
            <option value="yes">yes</option>
            <option value="No">No</option>
        </select>
        <br>
        Unit 1 ambience:
        <select>
            <option value="Very Satisfied">Very Satisfied</option>
            <option value="Satisfied">Satisfied</option>
            <option value="neutral">neutral</option>
            <option value="Unsatisfied">Unsatisfied</option>
            <option value="Very Unsatisfied">Very Unsatisfied</option>
        </select>

        <pre><textarea name="review" id="review"></textarea></pre>
        <input class="button" type="submit" name="submit" value="Save" />
    </form>
{% endblock content %}

如何将表单中的所有标签/值转换为单个字符串并分配给django变量{{ review }}?

谢谢,

莫汉

【问题讨论】:

    标签: python django


    【解决方案1】:

    在 Django 中,它应该完全使用 Django Forms 处理表单,因此最好在您的应用文件夹中创建一个 forms.py 文件,然后执行以下操作:

    from django.forms import forms
    
    class ReviewForm(forms.Form):
        PRECAUTIONS_CHOICES = (
            ('no', 'No'),
            ('yes', 'Yes')
        )
        UNIT1_CHOICES = (
            ('Very Satisfied', 'Very Satisfied'),
            ('Satisfied', 'Satisfied'),
            ('neutral', 'neutral'),
            ('Unsatisfied', 'Unsatisfied'),
            ('Very Unsatisfied', 'Very Unsatisfied'),
        )
        name = forms.Charfield()
        phone = forms.Charfield()
        email = forms.EmailField()
        precautions = forms.ChoiceField(choices= PRECAUTIONS_CHOICES, widget=forms.Select())
        unit1_ambience = forms.ChoiceField(choices= UNIT1_CHOICES, widget=forms.Select())
        review = forms.CharField(widget=forms.Textarea())
    
        def clean(self):
            # after checking every field is available and then concat values to each other
    
            if 'name' in self.cleaned_data and 'phone' in self.cleaned_data and ... :
                name = self.cleaned_data.get('name')
                phone = self.cleaned_data.get('phone')
                ...
                review = self.cleaned_data.get('review')
                expected_string = name + '\n' + phone + ... + review
                # concat all with review and then return string
                return expected_string
    
    

    然后在你的视图函数中做这样的事情

    from .forms import ReviewForm
    
    def revfile_save(request):
        form = ReviewForm(request.POST)
        if form.is_valid():
            review = form.cleaned_data
    
    

    您甚至可以创建像 def clean_name(self) 这样的方法 并检查输入是否为空或在每个字段上进行更多验证 调用 clean 方法

    请注意,您可以使用 django 表单和 ModelForms 做更多事情,因此最好阅读文档

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-24
      相关资源
      最近更新 更多