小编Sin*_*son的帖子

Django表单字段标签翻译

我有一个超过20个字段的基础形式.然后我有大约15个从该表单继承的其他表单,传入一个名为fields的参数,baseform用它来删除所有其他字段.最佳解释通过示例:

class BaseForm(forms.Form):
    reportid = forms.HiddenInput()
    fromdate = forms.DateField(label=_("From"), widget=widgets.AdminDateWidget())
    todate = forms.DateField(label=_("To"), widget=widgets.AdminDateWidget())
    sort_by = forms.ChoiceField(label=_("Sort by"), choices=[])
    .......

    def __init__(self, *args, **kwargs):
        fields = kwargs.pop('fields')
        #Pseudo:
        ***del self.fields[field] for field not in fields***

class SubForm(forms.Form):
    def __init__(self, *args, **kwargs):
        fields = ['reportid', 'todate']
        super(SubForm, self).__init__(fields=fields, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

结果表格看起来像这样:

class SubForm(forms.Form):
    reportid = forms.HiddenInput()
    todate = forms.DateField(label=_("To"), widget=widgets.AdminDateWidget())
Run Code Online (Sandbox Code Playgroud)

我的问题是,当BaseForm第一次初始化时,标签被绑定到具有活动语言的字段,当另一个用户使用另一种语言设置(或当前用户更改语言)登录时,字段标签不会更新.

我使用像这样的字典来解决方案:

labels = {
    'todate': lambda: _("To"),
    'fromdate': lambda: _("From"),
    .....
}
Run Code Online (Sandbox Code Playgroud)

然后在初始化基础形式循环遍历所有字段和设置时

self.fields[field].widget.label = labels[field]()
Run Code Online (Sandbox Code Playgroud)

我有更好的(阅读:更pythonic)方式实现这一目标吗?

python django internationalization django-forms

12
推荐指数
1
解决办法
7365
查看次数

防止 Django 更新 MSSQL 中的标识列

我正在使用 MSSQL 中的旧数据库。我们有一个表,其中有两列导致我出现问题:

class Emp(models.Model):  
    empid = models.IntegerField(_("Unique ID"), unique=True, db_column=u'EMPID')  
    ssn = models.CharField(_("Social security number"), max_length=10, primary_key=True, db_column=u'SSN') # Field name made lowercase.  
Run Code Online (Sandbox Code Playgroud)

所以该表以 ssn 列作为主键,django 生成的 SQL 更新代码的相关部分是这样的:

UPDATE [EMP] SET [EMPID] = 399, 
......... 
WHERE [EMP].[SSN] = 2509882579 
Run Code Online (Sandbox Code Playgroud)

问题是 EMP.EMPID 是 MSSQL 中的一个标识字段,因此每当我尝试将更改保存到现有员工时,pyodbc 都会抛出此错误:

ProgrammingError: ('42000', "[42000] [Microsoft][SQL Native Client][SQL Server]C
annot update identity column 'EMPID'. (8102) (SQLExecDirectW); [42000] [Microsof
t][SQL Native Client][SQL Server]Statement(s) could not be prepared. (8180)")
Run Code Online (Sandbox Code Playgroud)

将 EMP.EMPID 作为标识对程序的任何内容都不是至关重要的,因此通过创建临时列和复制、删除、重命名来删除它似乎是合乎逻辑的事情。这为将老客户转移到 Django 中创建了一个额外的步骤,所以我的问题是,有什么方法可以防止 Django 在我对这个表进行更新时生成 '[EMPID] …

sql-server django django-models pyodbc django-pyodbc

5
推荐指数
1
解决办法
1578
查看次数