我正在尝试使用默认的Django管理员创建一个简单的照片库.我想为每个图库保存一张示例照片,但我不想保留该名称.而不是文件名,我想保存模型的ID(N.jpg).但是我第一次想要保存对象时id不存在.我怎么能知道模型中的下一个自动增量,或以某种方式保存模型数据在上传之前super.save和之后上传文件时self.id存在?有一个很酷的解决方案吗?
像这样的东西:
def upload_path_handler(instance, filename):
ext = filename extension
return "site_media/images/gallery/{id}.{ext}".format(id=instance.nextincrement, ext=ext)
class Gallery(models.Model):
name = models.TextField()
image = models.FileField(upload_to=upload_path_handler)
Run Code Online (Sandbox Code Playgroud)
并且可能将文件名存储在不同的字段中.
我有一个过滤器currency,它取一个美元的价值并将其转换为一种货币(美元或英镑).要转换的货币存储在会话中,但过滤器不会占用RequestContext,所以我无法从那里直接获取它.
有没有比将相关会话元素传递到模板更好的方法,以及从模板到过滤器作为参数?虽然这种方法有效,但似乎相当可怕,而且我很可能最终将货币传递给(几乎)每个模板.
我的过滤器目前看起来像这样:
def currency(value, currency):
if currency == 'usd':
val = '$%.2f' % value
return mark_safe(val)
d = Decimal(value)
val = '£%.2f' % (d*Decimal('0.63'))
return mark_safe(val)
Run Code Online (Sandbox Code Playgroud) 我试图让所有descendants(include_self=True)不是一个节点,而是一个节点列表(一个QuerySet).这应该是一个SQL查询.
示例(实际上不起作用:)
some_nodes = Node.objects.filter( ...some_condition... )
some_nodes.get_descendants(include_self=True) #hopefully I would like
to have all possible Nodes starting from every node of "some_nodes"
Run Code Online (Sandbox Code Playgroud)
我现在唯一的想法是遍历some_nodes并为每个节点运行get_descendants() - 但这是一个非常糟糕的解决方案(大量的SQL查询).
如果没有干净的方法通过Django ORM这样做,你可以提供一个自定义SQL来运行吗?在这里你可以假设我有一个Node的pk列表.
编辑:如果这可以帮助 - 我的所有"some_nodes"都放在同一个父目录中,并在树中具有相同的"级别".
我有一个ModelForm,它包含一个使用RadioSelect小部件的ModelChoiceField.
class MyAForm(forms.ModelForm):
one_property = models.ModelChoiceField(
widget=forms.RadioSelect,
queryset=MyBModel.objects.filter(visible=True),
empty_label=None)
class Meta:
model = MyAModel
Run Code Online (Sandbox Code Playgroud)
我希望在单选按钮旁边显示MyBModel上的属性.我会覆盖label_from_instance上一个子类ModelChoiceField的,但这并不让我做我想做的,因为我想的单选按钮,显示它针对每个选择项对应的一行内.
所以我的模板中的某个地方我想要...
{% for field in form.visible_fields %}
{% if field.name == "one_property" %}
<table>
{% for choice in field.choices %}
<tr>
<td><input value="{{choice.id}}" type="radio" name="one_property" />{{choice.description}}</td>
<td><img src="{{choice.img_url}}" /></td>
</tr>
{% endfor %}
</table>
{% endif %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
不幸的是,field.choices返回对象的id和标签的元组,而不是查询集中的实例.
是否有一种简单的方法来获取ModelChoiceField的选项实例以在模板中使用?
我正在使用Django 1.4,我想设置验证规则来比较不同内联的值.
我有三个简单的课程
在models.py中:
class Shopping(models.Model):
shop_name = models.CharField(max_length=200)
class Item(models.Model):
item_name = models.CharField(max_length=200)
cost = models.IntegerField()
item_shop = models.ForeignKey(Shopping)
class Buyer(models.Model):
buyer_name = models.CharField(max_length=200)
amount = models.IntegerField()
buyer_shop = models.ForeignKey(Shopping)
Run Code Online (Sandbox Code Playgroud)
在admin.py中:
class ItemInline(admin.TabularInline):
model = Item
class BuyerInline(admin.TabularInline):
model = Buyer
class ShoppingAdmin(admin.ModelAdmin):
inlines = (ItemInline, BuyerInline)
Run Code Online (Sandbox Code Playgroud)
因此,例如,可以以10美元购买一瓶朗姆酒,以8美元购买伏特加酒.迈克支付15美元,汤姆支付3美元.
目标是防止用户使用不匹配的金额保存实例:已支付的金额必须与项目成本的总和相同(即10 + 8 = 15 + 3).
我试过了:
有没有解决这个问题的方法?客户端(javascript/ajax)验证最简单吗?
我最近在Django项目文档中创建了admin.py:
https://docs.djangoproject.com/en/dev/topics/auth/customizing/#django.contrib.auth.models.AbstractBaseUser
但我真的错过了允许管理员更改用户密码的功能.如何添加此功能?我只是复制并粘贴了上面链接中的代码.
from django import forms
from django.contrib import admin
from django.contrib.auth.models import Group
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import ReadOnlyPasswordHashField
from customauth.models import MyUser
class UserCreationForm(forms.ModelForm):
"""A form for creating new users. Includes all the required
fields, plus a repeated password."""
password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)
class Meta:
model = MyUser
fields = ('email', 'date_of_birth')
def clean_password2(self):
# Check that the two password entries match
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 …Run Code Online (Sandbox Code Playgroud) 我正在使用Django,我需要使用两个内部联接来执行查询集.
我有三个模型A,B和C,我想在psql中执行如下查询:
select DISTINCT a from A inner join B on B.a_id = A.id inner join C on C.b_id = B.id;
型号:(仅包括相关领域)
class A(models.Model):
id = models.IntegerField(primary_key=True)
class B(models.Model):
id = models.IntegerField(primary_key=True)
a = models.ForeignKey(A, null=True, blank=True,on_delete=models.SET_NULL)
class C(models.Model):
b = models.ForeignKey(B, null=True, on_delete=models.SET_NULL)
Run Code Online (Sandbox Code Playgroud)
因此,C中的所有内容都链接回B中的一个内容,而B中的所有内容都链接回A中的一个内容.我想尝试获取A中具有C语言内容的所有不同元素.
如何使用django queryset执行此操作?谢谢.
我是django的新手,我从南方得到这个错误,但我不知道我错过了什么.我搜索答案但我找不到任何东西.
There is no South database module 'south.db.postgresql_psycopg2' for your database. Please either choose a supported database, check for SOUTH_DATABASE_ADAPTER[S] settings, or remove South from INSTALLED_APPS.
Run Code Online (Sandbox Code Playgroud)
这是我的base_settings:
from unipath import Path
BASE_DIR = Path(__file__).ancestor(3)
SECRET_KEY = 'pp@iz7%bc7%+*11%usf7o@_e&)r2o&^3%zjse)n=6b&w^hem96'
DJANGO_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
)
THIRD_PARTY_APPS = (
'south',
)
LOCAL_APPS = (
)
INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
)
ROOT_URLCONF = 'misite.urls'
WSGI_APPLICATION = …Run Code Online (Sandbox Code Playgroud) 我的django代码中有2个模型:
class ModelA(models.Model):
name = models.CharField(max_length=255)
description = models.CharField(max_length=255)
created_by = models.ForeignKey(User)
class ModelB(models.Model):
category = models.CharField(max_length=255)
modela_link = models.ForeignKey(ModelA, 'modelb_link')
functions = models.CharField(max_length=255)
created_by = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)
假设ModelA有100条记录,所有记录都可能有也可能没有指向ModelB的链接
现在说我想获得每个ModelA记录的列表以及ModelB的数据
我会做:
list_a = ModelA.objects.all()
Run Code Online (Sandbox Code Playgroud)
然后,为了获得ModelB的数据,我必须这样做
for i in list_a:
i.additional_data = i.modelb_link.all()
Run Code Online (Sandbox Code Playgroud)
但是,这会在i的每个实例上运行查询.从而使101个查询运行.
有没有办法在一个查询中运行这一切.或者至少少于101个查询.
我试过投入,ModelA.objects.select_related().all()但这似乎没有任何影响.
谢谢
我想通过串联字符串过滤一些数据库对象.
正常的SQL查询将是:
SELECT concat(firstName, ' ', name) FROM person WHERE CONCAT(firstName, ' ', name) LIKE "a%";
Run Code Online (Sandbox Code Playgroud)
在模型中,我创建了一个名为PersonObjects的管理器:
class PersonObjects(Manager):
attrs = {
'fullName': "CONCAT(firstName, ' ', name)"
}
def get_query_set(self):
return super(PersonObjects, self).get_query_set().extra(
select=self.attrs)
Run Code Online (Sandbox Code Playgroud)
我也在我的模型中配置了这个:
objects = managers.PersonObjects()
Run Code Online (Sandbox Code Playgroud)
现在访问fullName适用于单个对象:
>>> p = models.Person.objects.get(pk=4)
>>> p.fullName
u'Fred Borminski'
Run Code Online (Sandbox Code Playgroud)
但它在过滤器中不起作用:
>>> p = models.Person.objects.filter(fullName__startswith='Alexei')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/lib/python2.7/site-packages/django/db/models/manager.py", line 141, in filter
return self.get_query_set().filter(*args, **kwargs)
File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 550, in filter
return self._filter_or_exclude(False, …Run Code Online (Sandbox Code Playgroud) django ×10
python ×10
django-admin ×3
database ×1
descendant ×1
django-1.5 ×1
django-forms ×1
django-south ×1
inner-join ×1
list ×1
mptt ×1
orm ×1
upload ×1