在不同的模板位置显示不同的Django表单

时间:2018-11-28 00:12:09

标签: python django django-forms django-templates

我有一个这样的模型:

models.py

import os
from shutil import copyfile

fileList = []
filePath = 'C:\\AD\\Scripts\\to_split'

for file in os.listdir(filePath):
    if file.endswith(".jpg"):
        fileList.append(file)

for file in fileList:
    fileName = os.path.splitext(file)[0].split("-")
    rangeStart = fileName[0]
    rangeEnd = fileName[1]
    for part in range(int(rangeStart), int(rangeEnd)+1):
        copyfile(os.path.join(filePath, file), os.path.join(filePath, str(part) + ".jpg"))

此模型的示例实例为:

from django.db import models

class Foo(models.Model):
    text = models.TextField()

Foo.objects.create(text="My first text [[@shorttext_1@]] random text.") Foo.objects.create(text="Select something from below [[@multipleselect_1@]]. text.") Foo.objects.create(text="A different form [[@shorttext_1@]] and another" "form [[@shorttext_2@]] random texts.") Foo.objects.create(text="Mixed form [[@shorttext_1@]] and another" "form [[@multipleselect_1@]] random text.") [[@shorttext_1@]]表示要放置在下面模板中的表单的位置和类型。 [[@multipleselect_1@]]是随机选择的降价样式占位符。

forms.py

[[@ @]]

views.py

from django import forms

class ShortTextForm(forms.Form):  # [[@shorttext_1@]] form
    short_text = forms.CharField(max_length=300)

class MultipleSelectionForm(forms.Form): # [[@multipleselect_1@]] form
    selection = forms.ChoiceField( 
        choices=[('A', 'A text'), ('B', 'B text')], 
        widget=forms.RadioSelect())

templates / index.html

from django.shortcuts import render

def text_view(request):
    if request.method == 'POST':
        # get the info for each form
    else:
        foo = Foo.objects.order_by('?').first()
        return render(
            request=request,
            template_name='templates/index.html',
            context={'text': foo.text})

是否可以在模板中显示{% extends "base.html" %} {% block body %} {{ text }} {% endblock %} 并呈现所需的表单?

当前,我在foo.text类中有一个type变量来指定表单的类型。而且我的视图只能呈现一种所需的形式,该形式只能放在文本的末尾。我只想使用一个模板在文本的任何位置呈现多种形式。

编辑:

举一个我想实现的输出示例:

Foo

此对象应在模板中呈现,以便输出看起来像这样:

enter image description here

1 个答案:

答案 0 :(得分:-1)

只需传递foo:

context={'foo': foo}

不是foo.text,而是在模板中使用if...else语句来确定您要做什么。

这也可以让您访问type变量:

{% if foo.type == some_type %}
    {{ form }}
    {% endif %}