gpt4 book ai didi

Django 自定义小部件渲染

转载 作者:行者123 更新时间:2023-12-02 20:15:35 28 4
gpt4 key购买 nike

一般问题

假设你有一个特定的模型

class MyModel(models.Model):
Name = models.CharField(max_length=64)

以及您用于创作的随附表格

class CreateMyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['name']

在正常情况下,当表单在模板中呈现时我通常会遍历模板中的字段

{%for field in form%}
{{field}}
{%endfor%}

当需要自定义样式时,我通常不得不求助于放置我的 <div> s 和 <span> s 在该循环中,并指定基本小部件及其 attrsMeta子类。

浏览 Django Documentation关于这个话题,我明白我好像必须玩 Media子类使所有操作发生在 widgetsMeta中的属性(property),但我就是无法理解它。

具体问题

假设我有一个模板,其中 TextInput表单需要呈现 as in this template :

<div class="form-group input-group">
<span class="input-group-addon">Name</span>
<input type="text" name="name" class="form-control" placeholder="MyModel Name">
</div>

我如何着手创建一个小部件,以便我可以通过使用获得相同的结果:

class CreateMyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['name']
widgets={'name':MyWidget(addon="Name",placeholder="MyModel Name")}

我知道占位符是我可以放在 attrs 中的东西TextInput 的初始化,但插件(或父 div,在本例中)不是或至少据我所知

我很抱歉问了一个很长的问题,我只是觉得我需要彻底解释这个问题,因为它已经困扰了我一段时间......

最佳答案

我们可以像下面那样做。

小工具

from django import forms
from django.template import loader
from django.utils.safestring import mark_safe


class MyWidget(forms.Widget):
template_name = 'widget_template.html'

def get_context(self, name, value, attrs=None):
return {'widget': {
'name': name,
'value': value,
}}

def render(self, name, value, attrs=None):
context = self.get_context(name, value, attrs)
template = loader.get_template(self.template_name).render(context)
return mark_safe(template)

widget_template.html

<div class="form-group input-group">
<span class="input-group-addon">Name</span>
<input type="text" class="form-control" id="mywidget-{{ widget.name }}" name="{{ widget.name }}" />
</div>

关于Django 自定义小部件渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52474288/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com