小编Ser*_*jik的帖子

使用当前模型ID的Django管理文件上传

我正在尝试使用默认的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)

并且可能将文件名存储在不同的字段中.

python django upload django-models django-admin

15
推荐指数
2
解决办法
7499
查看次数

Django - 从自定义过滤器中访问RequestContext

我有一个过滤器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)

python django django-templates

14
推荐指数
3
解决办法
1万
查看次数

django-mptt get_descendants获取节点列表

我试图让所有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"都放在同一个父目录中,并在树中具有相同的"级别".

python django list mptt descendant

14
推荐指数
2
解决办法
6776
查看次数

如何在模板中获取ModelChoiceField实例

我有一个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的选项实例以在模板中使用?

python django django-forms

14
推荐指数
1
解决办法
8455
查看次数

验证django admin中的依赖内联

我正在使用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).

我试过了:

  • 在Shopping.clean方法中引发ValidationError.但内联尚未更新,因此总和不正确
  • 在ShoppingAdmin.save_related方法中引发ValidationError.但是在这里提出ValidationError会给出一个非常用户不友好的错误页面,而不是重定向到更改页面,并带有一个很好的错误消息.

有没有解决这个问题的方法?客户端(javascript/ajax)验证最简单吗?

python django django-admin

14
推荐指数
1
解决办法
6588
查看次数

在Django Admin中更改密码

我最近在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)

python django django-admin django-1.5

14
推荐指数
3
解决办法
2万
查看次数

Django Inner Join Queryset

我正在使用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执行此操作?谢谢.

python django inner-join django-queryset

14
推荐指数
1
解决办法
2万
查看次数

您的数据库没有南数据库模块'south.db.postgresql_psycopg2'

我是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)

python django django-south

14
推荐指数
4
解决办法
2万
查看次数

在单个查询中获取外键对象 - Django

我的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()但这似乎没有任何影响.

谢谢

python django django-queryset

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

Django ORM:按额外属性过滤

我想通过串联字符串过滤一些数据库对象.

正常的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)

python database django orm

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