我想为forms.ModelChoiceField创建动态标签,我想知道如何做到这一点.我有以下表单类:
class ProfileForm(forms.ModelForm):
def __init__(self, data=None, ..., language_code='en', family_name_label='Family name', horoscope_label='Horoscope type', *args, **kwargs):
super(ProfileForm, self).__init__(data, *args, **kwargs)
self.fields['family_name'].label = family_name_label
.
.
self.fields['horoscope'].label = horoscope_label
self.fields['horoscope'].queryset = Horoscope.objects.all()
class Meta:
model = Profile
family_name = forms.CharField(widget=forms.TextInput(attrs={'size':'80', 'class': 'contact_form'}))
.
.
horoscope = forms.ModelChoiceField(queryset = Horoscope.objects.none(), widget=forms.RadioSelect(), empty_label=None)
Run Code Online (Sandbox Code Playgroud)
默认标签由"配置文件"定义中指定的unicode函数定义.但是,需要动态创建ModelChoiceField创建的单选按钮的标签.
首先,我认为我可以简单地重写ModelChoiceField,如Django文档中所述.但这会创建静态标签.它允许您定义任何标签,但一旦做出选择,该选择是固定的.
所以我认为我需要适应添加一些东西到init:
class ProfileForm(forms.ModelForm):
def __init__(self, data=None, ..., language_code='en', family_name_label='Family name', horoscope_label='Horoscope type', *args, **kwargs):
super(ProfileForm, self).__init__(data, *args, **kwargs)
self.fields['family_name'].label = family_name_label
.
.
self.fields['horoscope'].label = horoscope_label …Run Code Online (Sandbox Code Playgroud) 我有一个模特
class Article(models.Model):
.
.
language = models.ForeignKey(Language, help_text="Select the article's language")
parent_article = models.ForeignKey('self', null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)
如果文章是原始文章,那么'parent_article = None'.如果文章是翻译,那么'parent_article'<>无.
所以我创建了:
class ArticleAdminForm(forms.ModelForm):
.
.
parent_article = forms.ModelChoiceField(queryset=AyurvedicArticle.objects.filter(parent_article=None), help_text="Select the parent article (if any)")
class Meta:
Article
class ArticleAdmin(admin.ModelAdmin):
form = ArticleAdminForm
.
.
Run Code Online (Sandbox Code Playgroud)
现在,当我应用所有这些似乎工作正常,但当我没有选择'父文章'时,我在管理员中收到一条错误消息,声明"此字段是必需的",即使模型说:"null = True,Blank =真".
当我不使用自定义表格时,即发酵声明
class ArticleAdmin(admin.ModelAdmin):
# form = ArticleAdminForm
.
.
Run Code Online (Sandbox Code Playgroud)
一切都运转,除了现在我有很多选择.在"ModelChoicesField"的文档中,您可以阅读短语"请注意,如果需要ModelChoiceField ......",这意味着不需要ModelChoiceField.
知道怎么处理这个吗?
我有一个postgresql 9.1数据库表,"en_US.UTF-8":
CREATE TABLE branch_language
(
id serial NOT NULL,
name_language character varying(128) NOT NULL,
branch_id integer NOT NULL,
language_id integer NOT NULL,
....
)
Run Code Online (Sandbox Code Playgroud)
name_language属性包含各种语言的名称.该语言由外键language_id指定.
我创建了一些索引:
/* us english */
CREATE INDEX idx_branch_language_2
ON branch_language
USING btree
(name_language COLLATE pg_catalog."en_US" );
/* catalan */
CREATE INDEX idx_branch_language_5
ON branch_language
USING btree
(name_language COLLATE pg_catalog."ca_ES" );
/* portuguese */
CREATE INDEX idx_branch_language_6
ON branch_language
USING btree
(name_language COLLATE pg_catalog."pt_PT" );
Run Code Online (Sandbox Code Playgroud)
现在,当我做一个选择时,我没有得到我期待的结果.
select name_language from branch_language
where language_id=42 -- id of …Run Code Online (Sandbox Code Playgroud) 在 Django 应用程序中,我需要创建一个订单号,如下所示:yyyymmddnnnn,其中 yyyy=年,mm=月,dd=日,nnnn 是 1 到 9999 之间的数字。
我想我可以使用 PostgreSQL 序列,因为生成的数字是原子的,所以我可以确定当进程获取一个数字时,该数字是唯一的。
所以我创建了一个 PostgreSQL 序列:
CREATE SEQUENCE order_number_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9999
START 1
CACHE 1
CYCLE;
Run Code Online (Sandbox Code Playgroud)
该序列可以作为具有一行的表来访问。因此,在文件 checkout.py 中,我创建了一个 Django 模型来访问此序列。
class OrderNumberSeq(models.Model):
"""
This class maps to OrderNumberSeq which is a PostgreSQL sequence.
This sequence runs from 1 to 9999 after which it restarts (cycles) at 1.
A sequence is basically a special single row table.
"""
sequence_name = models.CharField(max_length=128, primary_key=True)
last_value = models.IntegerField()
increment_by = …Run Code Online (Sandbox Code Playgroud) 我有一个模型和一个表单(forms.ModelForm),其中有一个 ImageField。该模型类似于:
class Business(models.Model):
business_name = models.CharField(max_length=128)
.
.
business_image = ImageField(
max_length=128,
upload_to=upload_business_image_handler,
height_field='business_image_height',
width_field='business_image_width'
)
business_image_height = models.IntegerField(blank=True, null=True)
business_image_width = models.IntegerField(blank=True, null=True)
.
.
Run Code Online (Sandbox Code Playgroud)
附表:
class BusinessForm(forms.ModelForm):
def __init__(self, data=None, files=None, branch_list = None, country_list = None, *args, **kwargs):
super(BusinessForm, self).__init__(data, *args, **kwargs)
# create the MultipleChoiceField choice_list based on language
self.fields['branch'].choices = branch_list
self.fields['country'].choices = country_list
self.postdata = data
self.files = files
business_name = forms.CharField(widget=forms.TextInput(attrs={'size':'50', 'class': 'address'}), required=True)
#business_image = forms.ImageField(widget=forms.ClearableFileInput())
Run Code Online (Sandbox Code Playgroud)
表单中的最后一行被注释掉,因为 forms.ClearableFileInput() 是 FileFields 和 …
我有一个字段定义为的模型
p = models.DecimalField(max_digits=12, decimal_places=6)
Run Code Online (Sandbox Code Playgroud)
但decimal_places=6 仅用于内部精度。我只想在管理字段中显示 2 个小数位。所以我想也许我可以用属性做点什么。但是属性不会在管理界面中显示为字段。例如:数据库记录:100.256754 admin 编辑字段显示:100.26
有没有办法做到这一点?