我的项目中有很多复杂的表单,我一直觉得我可以更优雅,更简单地编写它们.所以我的问题是什么是一些可能对我有帮助的优秀应用和实践?具体来说,我正在考虑我需要做的事情:
任何其他更复杂的表单方案的解决方案也欢迎.以上是我已经遇到的问题,但我想一般了解一下表格的最佳实践.
我一直在干净的方法中做这样的事情:
if self.cleaned_data['type'].organized_by != self.cleaned_data['organized_by']:
raise forms.ValidationError('The type and organization do not match.')
if self.cleaned_data['start'] > self.cleaned_data['end']:
raise forms.ValidationError('The start date cannot be later than the end date.')
Run Code Online (Sandbox Code Playgroud)
但那意味着表单一次只能引发其中一个错误.表单有没有办法提出这两个错误?
编辑#1:上述任何解决方案都很棒,但是会喜欢在以下情况下也可以使用的方法:
if self.cleaned_data['type'].organized_by != self.cleaned_data['organized_by']:
raise forms.ValidationError('The type and organization do not match.')
if self.cleaned_data['start'] > self.cleaned_data['end']:
raise forms.ValidationError('The start date cannot be later than the end date.')
super(FooAddForm, self).clean()
Run Code Online (Sandbox Code Playgroud)
其中FooAddForm是ModelForm并且具有可能也会导致错误的唯一约束.如果有人知道这样的事情那会很棒......
可以说我有两个django应用程序:
在竞赛应用程序中,我有一个代表竞赛部分的模型:
class Division(models.Model):
competition = models.ForeignKey(Competition)
discipline = models.CharField(max_length=1, choices=DISCIPLINE_CHOICES)
age_group = models.ForeignKey(AgeGroup)
participants = models.ManyToManyField(Competitor, through='Entry')
Run Code Online (Sandbox Code Playgroud)
我想把Entry模型放在条目应用程序中:
class Entry(models.Model):
division = models.ForeignKey('Division')
competitor = models.ForeignKey(Competitor)
withdrawn = models.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)
如何解决from ... import ...语句,以便它们有效?当我输入import语句时,例如from entries.models import Entry我从syncdb忽略这些应用程序的模型(因为导入是循环的)或当我删除其中一个或两个时,我得到验证错误:
错误:一个或多个模型没有验证:entries.entry:'division'与模型Division有关系,它没有安装或者是抽象的.competitions.division:'参与者'通过模型Entry指定m2m关系,该关系尚未安装
我理解为什么会发生这种情况,但我不知道如何更改它,以便它可以工作(不需要将Entry模型移动到竞赛应用程序中,我真的不想这样做).
错误的全文是:
在/的TemplateSyntaxError
渲染时捕获异常:当前事务被中止,命令被忽略直到事务块结束
我最近重新安装了计算机上的所有软件.以前用过的代码没问题.它在朋友的计算机和开发服务器上仍然没有问题.
我唯一能想到的,可能已经改变的是postgresql服务器版本(我实际上并不确定我是否尝试在我的旧安装上运行8.4或者没有 - 它绝对适用于8.3).有人能够确认Django有postgresql 8.4的问题和/或有任何提示,为什么我有这些错误?
为了回应Dominic ......这不仅仅发生在一个页面或一个标签上(虽然有些页面似乎没问题).导致错误的标签和变量的唯一共同点是它们碰巧在途中的某个地方访问数据库(尽管并非所有访问数据库的标签都会导致错误).此外,相同的代码不会在其他计算机上创建TemplateSyntaxError.
如果我删除了发生错误的变量或自定义模板标记,那么这就是发生的事件链:
Traceback (most recent call last):
File "/usr/lib/python2.6/site-packages/django/core/servers/basehttp.py", line 279, in run
self.result = application(self.environ, self.start_response)
File "/usr/lib/python2.6/site-packages/django/core/servers/basehttp.py", line 651, in __call__
return self.application(environ, start_response)
File "/usr/lib/python2.6/site-packages/django/core/handlers/wsgi.py", line 245, in __call__
response = middleware_method(request, response)
File "/usr/lib/python2.6/site-packages/debug_toolbar/middleware.py", line 90, in process_response
response.content = replace_insensitive(smart_unicode(response.content), u'', smart_unicode(self.debug_toolbars[request].render_toolbar() + u''))
File "/usr/lib/python2.6/site-packages/debug_toolbar/toolbar/loader.py", line 72, in render_toolbar
'BASE_URL': self.request.META.get('SCRIPT_NAME', ''),
File "/usr/lib/python2.6/site-packages/django/template/loader.py", line 108, in render_to_string
return t.render(context_instance)
File … 我正在尝试遵循此答案中的准则,但是我对如何编辑模板一无所知。
我的admin.py的相关部分:
SegmentFormset = forms.models.inlineformset_factory(Division,Segment)
class DivisionForm(forms.ModelForm):
def __init__(self, **kwargs):
super(DivisionForm, self).__init__(**kwargs)
self.segment_formset = SegmentFormset(instance=self.instance, data=self.data,
prefix=self.prefix)
def is_valid(self):
return (super(DivisionForm, self).is_valid() and
self.segment_formset.is_valid())
def save(self, commit=True):
assert commit == True
res = super(DivisionForm, self).save(commit=commit)
self.segment_formset.save()
return res
class DivisionInline(admin.TabularInline):
model = Division
form = DivisionForm
template = 'competitions/admin/tabular.html'
class CompetitionAdmin(VersionAdmin):
inlines = [DivisionInline,]
Run Code Online (Sandbox Code Playgroud)
我模板的相关部分:
{% for fieldset in inline_admin_form %}
{% for line in fieldset %}
{% for field in line %}
<td …Run Code Online (Sandbox Code Playgroud) 我有以下错误:
/ admin/results_cop/copsegmentresult上的TemplateSyntaxError /
在渲染时抓住异常:('ascii','ISU欧洲花样滑冰锦标赛2009:高级女士们:短节目 - 2. Susanna P\xc3\x96YKI\xc3\x96',98,99,'序数不在范围内( 128)')
不呈现的字符串片段是:PÖYKIÖ
我没有得到的是为什么Django试图将字符串呈现为ASCII,为什么不是UTF-8?
我忘了问 - 我也很想知道如何摆脱错误;)
Bobince的答案是正确的:)我有类似的东西:
def __unicode__(self):
return "%s %s" (self.foo, self.bar)
Run Code Online (Sandbox Code Playgroud) 我在使用virtualenv在passenger_wsgi模块上部署Django时遇到了一些麻烦.passenger_wsgi.py文件中的Python代码应该解决我的问题:
import os, sys
INTERP = '/home/login/.virtualenvs/env_name/bin/python'
if sys.executable != INTERP:
os.execl(INTERP, INTERP, *sys.argv)
Run Code Online (Sandbox Code Playgroud)
我理解的前三行,但我对第四行只有一个含糊不清的想法,那就是碰巧给我一个错误:
/home/login/.virtualenvs/env_name/bin/python: can't find '__main__.py' in ''
那么os.execl到底在做什么呢?那个错误信息意味着什么?
django ×6
python ×5
django-forms ×3
django-admin ×2
virtualenv ×2
django-apps ×1
encoding ×1
os.execl ×1
postgresql ×1
unicode ×1