我想抓住Django.我在Eclipse上使用Pydev.我写了一个简单的注册页面,我无法工作.Eclipse抱怨User.DoesNotExist未定义.最有可能的是,我遗漏了一些微不足道的东西.这是代码的相关部分:
from django.contrib.auth.models import User
...
class SignUpForm (forms.Form):
...
def clean_username (self):
try:
User.objects.get(username=self.cleaned_data['username'])
except User.DoesNotExist:
return self.cleaned_data['username']
raise forms.ValidationError(USERNAME_ALREADY_IN_USE)
...
Run Code Online (Sandbox Code Playgroud) 假设我有一个继承自SuperFoo的模型Foo:
class SuperFoo(models.Model):
name = models.CharField('name of SuperFoo instance', max_length=50)
...
class Foo(SuperFoo):
... # do something that changes verbose_name of name field of SuperFoo
Run Code Online (Sandbox Code Playgroud)
在类Foo中,我想覆盖SuperFoo的name字段的verbose_name.我可以吗?如果没有,是在模型表单定义中设置标签以使其显示在模板中的最佳选项吗?
我想捆绑css和javascript文件.我还想向客户端发送远期过期标头,因此我需要文件版本控制.
通过互联网进行的快速搜索表明,为Django开发了几种资产管理器.以下是我可以达到的列表:
他们似乎或多或少地执行相同的工作.django-compress,django-compressor和django-site-assets乍一看似乎特别有前途.如果有人提供任何有助于我们在他们之间做出选择的反馈,我将不胜感激.
我想要一个带有计算字段的模型,我可以应用排序.例如,假设我有以下模型:
class Foo(models.Model):
A = models.IntegerField(..)
B = models.IntegerField(..)
C = models.ForeignKey(..)
Run Code Online (Sandbox Code Playgroud)
我希望有一个D和E字段,由以下公式计算:
如果我不需要应用排序,那么实现这一点将是微不足道的; 我只想添加属性到模型类.但是,我需要按这些字段排序.
一个解决方案是将所有记录提取到内存中并在那里进行排序,我认为这是最后的手段(它将破坏关于分页的事情).
有没有办法实现我正在尝试的东西?任何指导表示赞赏.
编辑:非规范化是一个禁忌.字段X的值非常频繁地改变,并且许多Foo记录与模型C的一个记录相关.X的更新将需要数千个E的更新.
我有一个夹具(json),它在开发环境中加载,但在服务器环境中没有这样做.错误说:" DatabaseError: value too long for type character varying(50)"
我的开发环境是Windows和Postgres 8.4.服务器运行Debian和Postgres 8.3.两个系统中的数据库编码均为UTF8.
就好像夹具中的unicode标记计为服务器上的字符,它们会导致某些字符串超出其字段的最大长度.然而,这在开发环境中不会发生..
创建平面页面时,我希望用户从预定义列表中选择模板.为了保持该Flatpage模式不变,我更喜欢ChoiceField过ModelChoiceField(后者提供模板的PK,但我需要为TEMPLATE_NAME字段中的名称):
class NewFlatpageForm(FlatpageForm):
template_name = forms.ChoiceField(choices = [])
def __init__(self, *args, **kwargs):
self.base_fields['template_name'].choices = ProjectTemplate.objects.values_list('path', 'name')
super(NewFlatpageForm, self).__init__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
我重写__init__或Django在服务器启动时填充选项,然后不更新列表.
我没有任何管理员经验,但fields在不使用admin时我使用该属性做了类似的事情.但是在这种情况下,我得到一个异常,告诉fields它不是表单的属性.__dict__向我展示了一个base_fields属性并使用它有效.那么,为什么在这里使用base_fields,为什么fields不存在,最后我做了什么hacky?
我的模型有一个名为"state"的字段:
class Foo(models.Model):
...
state = models.IntegerField(choices = STATES)
...
Run Code Online (Sandbox Code Playgroud)
对于每个州,可能的选择是所有州的某个子集.例如:
if foo.state == STATES.OPEN: #if foo is open, possible states are CLOSED, CANCELED
...
if foo.state == STATES.PENDING: #if foo is pending, possible states are OPEN,CANCELED
...
Run Code Online (Sandbox Code Playgroud)
因此,当foo.state更改为新状态时,其可能的选择集也会更改.
如何在管理员添加/更改页面上实现此功能?
假设我有这个字符串:
s = '<p>Hello!</p>'
Run Code Online (Sandbox Code Playgroud)
当我将此变量传递给模板时,我希望它呈现为原始html.查看文档,我看到我可以使用安全过滤器:
{{s|safe}}
Run Code Online (Sandbox Code Playgroud)
或禁用autoescape:
{%autoescape off}
{{s}}
{%endautoescape%}
Run Code Online (Sandbox Code Playgroud)
或者在python代码中声明它是安全的:
from django.utils.safestring import mark_safe
s = mark_safe(s)
Run Code Online (Sandbox Code Playgroud)
这些选项都不适用于我.无论我做什么,字符串显示为:
<p>Hello!</p>
Run Code Online (Sandbox Code Playgroud)
我一定是错过了什么,只是弄不清楚是什么.是否存在某些不允许逃避的安全设置?
编辑:奇怪,我重新启动计算机后问题似乎消失了.
下面的类继承自Textarea小部件,并具有javascript代码,显示用户可以在textarea中输入的字符数.
class TextAreaWithCharCounter(forms.Textarea):
class Media:
js = ('js/jquery.charcounter.js',)
def render(self, name, value, attrs = None):
id = attrs['id']
max_length = self.attrs.get('max_length', 200)
output = super(TextAreaWithCharCounter, self).render(name, value, attrs)
output += mark_safe(u'''
<script type="text/javascript">
$("#%s").charCounter(%d, {classname:"charcounter"});
</script>'''%(id, max_length))
return output
Run Code Online (Sandbox Code Playgroud)
表格代码的相关部分如下:
class MyForm(forms.Form):
foo = forms.CharField(max_length = 200, widget = TextAreaWithCharCounter(attrs={'max_length':200}))
...
Run Code Online (Sandbox Code Playgroud)
你可以看到我传递了max_length两次参数,一个用于字段,一个用于小部件.更好的方法是从窗口小部件内部访问表单字段并获取其max_length属性,以便窗口小部件不需要max_length参数.我怎样才能做到这一点?
我从Foo模型中获取最新的5行,该模型按日期时间字段排序.
qs = Foo.objects.all()[:5]
Run Code Online (Sandbox Code Playgroud)
在下面的步骤中,我想通过一些其他标准(实际上,通过相反方向的相同datetime字段)对查询集重新排序.但是不允许在切片后重新排序.reverse()取消第一个排序,给我一个不同的查询集.有没有办法实现我想要的,而无需从查询集创建列表并使用它进行排序?
django ×10
python ×4
django-admin ×2
django-apps ×1
django-forms ×1
django-orm ×1
html ×1
inheritance ×1
postgresql ×1
pydev ×1
rendering ×1
utf-8 ×1