如何使用包含标签将表单加载到Django基本模板中,从而避免RecursionError?

时间:2018-12-25 11:22:50

标签: python django

我已经尝试过以多种方式使用包含标记,例如将html文件分离并将其包含在基本模板(layout.html)中,甚至直接在基本模板(layout.html)中使用,我一直在得到
/的RecursionError 超过最大递归深度

在app / forms.py

class UserSettingsForm(forms.ModelForm):
class Meta:
    model = UserSettings
    fields = ['theme_color','text_color']
    widgets = {
        'theme_color':forms.Select(attrs={'class':'form-control'}),
        'text_color':forms.Select(attrs={'class':'form-control'})
    }
    error_messages = {
        NON_FIELD_ERRORS : {
            'unique_together': "%(model_name)s's %(field_labels)s are not unique.",
        }
    }

在app / templatetags / theme.py中

@register.inclusion_tag('layout.html')
def settings_form():
    set_form = UserSettingsForm()
    return {'set_form':set_form}

在layout.html

{% load theme %}
...
<form action="{% url 'set_settings' %}" method="post">
   {% csrf_token %}}
   {% settings_form %}
   {{set_form}}
</form>

我希望将表单显示在该layout.html扩展到的所有页面上,因此从视图发送表单是不可能的。

我一直在听关于RequestContext的消息,但是我不知道如何使用它来呈现它。如果您知道,请描述在何处创建此新文件以实现此功能以及如何执行。

1 个答案:

答案 0 :(得分:0)

在一个我尝试使用context_processors的朋友的帮助下,我通过在context.py中创建一个app文件并编写一个简单的2行代码将该表单添加到context_processors中

def settings_form(request):
    return {'set_form': UserSettingsForm()}

,然后将app.context.settings_form添加到设置中的context_processors中。 现在,我可以轻松呈现表单了。花了很多时间才了解2行代码。 Python确实比我想象的要容易。