试图把表格从通用.FormView至通用.DetailVi

2024-10-03 21:36:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我是刚到Django的,这只是对下一代车型的测试。我正试着给你一张表格通用.FormView至通用.DetailView,并将上一个HTML(与FormView关联)中插入的数据展示给另一个HTML(与DetailView关联)。我想这可能是因为视图.py以及网址.py. 代码为:

你知道吗视图.py地址:

class IndexView(generic.FormView):
    template_name = 'dutos/index.html'
    form_class = GetDate
    success_url = 'dutos/detail.html'

    #def form_valid(self, form):                                   
       #return HttpResponse(self.success_url)
       #return super.form_valid(form)

class DetailView(generic.DetailView):
    model = Dutos
    template_name = 'dutos/detail.html'

你知道吗表单.py你知道吗

class GetDate(forms.Form):
    dateDataInicial = forms.DateTimeField(label='dataInicial', initial=datetime.now().strftime("%d/%m/%Y %H:%M:%S"), required=False)
    dateDataFinal = forms.DateTimeField(label='dataFinal', initial=datetime.now().strftime("%d/%m/%Y %H:%M:%S"), required=False)

你知道吗网址.py地址:

from django.urls import path
from .views import views

urlpatterns = [
    path('', views.IndexView.as_view(), name="index"),
    path('detail/', views.DetailView.as_view(), name="detail"),
]

你知道吗索引.html地址:

<!DOCTYPE html>
<html>
<head>
<title>Template</title>
</head>
<body>
<h1>Teste HTML</h1>
<div class="container-fluid" id="wrapper">
    <div class="row">
        <form action="/detail/" method="post">
            {% csrf_token %}
            {{ form.non_field_errors }}
            <div>
                <div class="fieldWrapper">
                    {{ form.dateDataInicial.errors }}
                    <label for="{{ form.dateDataInicial }} Data Inicial: </label>
                    {{ form.dateDataInicial }}
                </div>
                <div class="fieldWrapper">
                    {{ form.dateDataFinal.errors }}
                    <label for="{{ form.dateDataFinal }} Data Final: </label>
                    {{ form.dateDataFinal }}
                </div>
            <input type="submit" value="Pesquisar">
            </div>
        </form>
    </div>
</div>
</body>
</html>

你知道吗详细信息.html地址:

<!DOCTYPE html>
<html>
<head>
<title>Template</title>
</head>
<body>

<h1>Template HTML</h1>
{{form.cleaned_data['dateDataInicial']}}
{{form.cleaned_data['dateDataFinal']}}

</body>
</html>

我已经换了”{{form.u数据['dateDataInicial']}}“到”表单.dateDataInicial,或者只是清理了所有内容,并将“Test”放在simples HTML中。我收到HTTP错误405。你知道吗


Tags: namepydivform地址htmlheadlabel
2条回答

多亏了Daniel和他的代码的帮助,我找到了导致我需要的修改。我已将DetailView的genericView更改为“通用.DetailView“至”通用.ListView". 当它被制造出来时,另一个问题出现了。为了通过JSON传递“datetime”,它将转换为字符串格式,并且所有日期都被视为字符串,因此我无法在中的单独字段中显示这两个日期详细信息.html. 为了克服这个问题,我修改了Daniel提出的解决方案,并将字段一分为二,这样就可以通过form.u数据并将其转换为字符串,现在我不需要担心JSON序列化“datetime”。你知道吗

你知道吗视图.py地址:

class IndexView(generic.FormView):
    template_name = 'dutos/index.html'
    form_class = GetDate
    success_url = reverse_lazy('detail')

    def form_valid(self, form):
        #self.request.session['dates'] = json.dumps(form.cleaned_data, cls=DjangoJSONEncoder)
        self.request.session['dateInicial'] = str(form.cleaned_data['dateDataInicial'])
        self.request.session['dateFinal'] = str(form.cleaned_data['dateDataFinal'])
        return super().form_valid(form)

class DetailView(generic.ListView):
    model = Dutos
    template_name = 'dutos/detail.html'

    def get_context_data(self, **kwargs):
        #kwargs['dates'] = self.request.session.pop('dates', {})
        kwargs['dateInicial'] = self.request.session.pop('dateInicial', {})
        kwargs['dateFinal'] = self.request.session.pop('dateFinal', {})
        return super().get_context_data(**kwargs)

你知道吗索引.html地址:

<div class="container-fluid" id="wrapper">
    <div class="row">
        <form action="" method="post">
            {% csrf_token %}
            {{ form.non_field_errors }}
            <div>
                <div class="fieldWrapper">
                    {{ form.dateDataInicial.errors }}
                    <label for="{{ form.dateDataInicial }} Data Inicial: </label>
                    {{ form.dateDataInicial }}
                </div>
                <div class="fieldWrapper">
                    {{ form.dateDataFinal.errors }}
                    <label for="{{ form.dateDataFinal }} Data Final: </label>
                    {{ form.dateDataFinal }}
                </div>
            <input type="submit" value="Pesquisar">
            </div>
        </form>
    </div>
</div>

你知道吗详细信息.html地址:

<body>

<h1>Detalhes</h1>

{{ dateFinal }}
<br>
{{ dateInicial }}

</body>

你发布的代码确实有很多错误。你知道吗

得到405是因为索引模板中的表单试图直接发布到详细信息URL,而该URL未设置为接受post请求。这样做的另一个问题是表单不会被验证,因为验证应该在IndexView中进行,而不是在DetailView中。另外,DetailView对表单一无所知,因此form.cleaned_data将不存在于模板上下文中;而且Django模板语法不支持通过方括号进行字典查找,因此{{ form.cleaned_data['dateDataInicial'] }}将不起作用。你知道吗

为了使验证生效,您需要将表单提交回IndexView,然后IndexView将重定向到detail视图。(代码的另一个问题是success\u url应该是一个url,而不是模板路径。)然后问题就变成了如何从一个视图到另一个视图获取数据;会话是一种很好的方法。所以:

class IndexView(generic.FormView):
    template_name = 'dutos/index.html'
    form_class = GetDate
    success_url = reverse_lazy('detail')

    def form_valid(self, form):                                   
       self.request.session['dates'] = form.cleaned_data
       return super.form_valid(form)

在中更改窗体标记索引.html地址:

 <form action="" method="post">

局部视图:

class DetailView(generic.DetailView):
    model = Dutos
    template_name = 'dutos/detail.html'

    def get_context_data(self, **kwargs):
        kwargs['dates'] = self.request.session.pop('dates', {})
        return super().get_context_data(**kwargs)

而且在详细信息.html地址:

{{ dates.dateDataInicial }}
{{ dates.dateDataFinal }}

相关问题 更多 >