【问题标题】:Django: return form data on the same pageDjango:在同一页面上返回表单数据
【发布时间】:2017-05-23 15:19:48
【问题描述】:

如何将“标题”添加到上下文中,以便在模板中访问它。我想它需要通过才能以某种方式获取请求?将这个变量传递给 FormView 类中的 get 方法的 Pythonic 方法是什么?

views.py

class IndexView(FormView):
    template_name = 'index.html'
    form_class = CheckForm
    success_url = reverse_lazy('index')

    def form_valid(self, form, **kwargs):
        context = self.get_context_data(**kwargs)
        context['headers'] = form.result()
        return super(IndexView, self).form_valid(form)

index.html

<form action="." method="post" name="url" id="url" novalidate>
    {{ form.as_p }}
    {% csrf_token %}
<button type="submit">Check</button>

{% if headers %}
{% for k,v in headers %}
{{ k }}: {{ v }}<br>
{% endfor %}
{% else %}
<br>No data
{% endif %}

forms.py

from django import forms

import requests

class CheckForm(forms.Form):
    url = forms.URLField(max_length=255, label='')

    def result(self):
        cd = self.cleaned_data
        url = cd['url']
        r = requests.get(url)
        r.headers
        return r

urls.py

urlpatterns = [
    url(r'^$', views.IndexView.as_view(), name='index'),
]

【问题讨论】:

  • 您是否尝试过返回r.headers 而不是r

标签: python django


【解决方案1】:

我很确定你想使用messages

from django.contrib import messages

所以现在您可以添加一些内容并将其发送到下一个模板。

messages.success(request, u"Success message - text only")

在模板中:

{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>
        {% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %}Important: {% endif %}
        {{ message }}
    </li>
    {% endfor %}
</ul>
{% endif %}

【讨论】:

  • 我不认为这就是他想要的。
【解决方案2】:

主要问题是成功时的重定向。这将向同一窗口抛出另一个获取请求。在您的情况下,这是不希望的,因为您想利用表单中的数据。

views.py

import requests

class IndexView(FormView):
    template_name = 'index.html'
    form_class = CheckForm

    def form_valid(self, form, **kwargs):
        context = self.get_context_data()
        context['headers'] = form.get_headers()
        return self.render_to_response(context)       

forms.py

import requests
from django import forms

class CheckForm(forms.Form):
    url = forms.URLField(max_length=255, label='')

    def get_headers(self):
        if self.cleaned_data:
            url = self.cleaned_data['url']
            return requests.get(url).headers
        return {}

index.html

<form action="." method="post" name="url" id="url" novalidate>
    {{ form.as_p }}
    {% csrf_token %}
<button type="submit">Check</button>

{% if headers %}
{% for k,v in headers.items %}
{{ k }}: {{ v }}<br>
{% endfor %}
{% else %}
<br>No data
{% endif %}

【讨论】:

  • 谢谢,但我收到了'CheckForm' object has no attribute 'cleaned_data',显然还有no need to use get_context_data
  • 好点,我自己不知道那个。完善了我的答案,因为它显然是错误的。希望这有助于更多,至少在我的本地工作。
  • 感谢您的所有努力,但我相信建议在发布请求后始终使用重定向,这样刷新页面时就不会再次发送数据(我会将结果存储在数据库中)。这似乎是一项简单的任务,但我找不到解决方案……我希望在不查询数据库的情况下立即显示结果,但我最终可能为此使用两个不同的视图并从数据库中提取数据。
【解决方案3】:

有类似的要求,并将自定义上下文(此处为已处理文件)和 form_valid() 中的原始 form 实例传递给 render 方法,而不是表单默认的 HttpResponseRedirect

# forms.py

class MyForm(forms.Form):
    file = forms.FileField()
# views.py

class MyFormView(FormView):
    template_name = 'path/to/template/mytemplate.html'
    form_class = MyForm

    def get_success_url(self):
        return self.request.path

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['processed_data'] = None
        return context

    def do_some_processing(self, file):
        # process file...
        return processed_data

    def form_valid(self, form):
        form = super().form_valid(form)

        custom_context = {
            "form": self.form_class,
            "processed_data": self.do_some_processing(self.request.FILES['file']),
        }
        context = self.get_context_data(form=form)
        context.update(custom_context)

        return render(self.request, self.template_name, context)
# mytemplate.html

<form method="POST" enctype="multipart/form-data">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit">Submit</button>
</form>

<pre>
{{ processed_data }}
</pre>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    相关资源
    最近更新 更多