如何解决类中变量的名称错误

时间:2016-02-05 22:10:02

标签: python django django-models

我正在创建我的第一个模型,我正在创建一个上传系统,该系统上传到一个文件夹,其中包含上传它的用户名。

出于某种原因,当我尝试从模型创建对象时出现此错误:

from django.core.exceptions import ValidationError
from django.db import models
from django.core.files.images import get_image_dimensions

# Create your models here.


class Track(models.Model):

    user_name = "no_user"

    def get_username():
        user_name = "no_user"
        if request.user.is_authenticated():
            user_name = request.user.username
        else:
            user_name = "DELETE"

    def generate_user_folder_tracks(instance, filename):
        return "uploads/users/%s/tracks/%s" % (user_name, filename)

    def is_mp3(value):
        if not value.name.endswith('.mp3'):
            raise ValidationError(u'You may only upload mp3 files for tracks!')

    def generate_user_folder_art(instance, filename):
        return "uploads/users/%s/art/%s" % (user_name, filename)

    def is_square_png(self):
        if not self.name.endswith('.png'):
            raise ValidationError("You may only upload png files for album art!")
        else:
            w, h = get_image_dimensions(self)
            if not h == w:
                raise ValidationError("This picture is not square! Your picture must be equally wide as its height.")
            else:
                if not (h + w) >= 1000:
                    raise ValidationError("This picture is too small! The minimum dimensions are 500 by 500 pixels.")
        return self


    # Variables

    track_type_choices = [
        ('ORG', 'Original'),
        ('RMX', 'Remix'),
        ('CLB', 'Collab'),
        ('LIV', 'Live'),
    ]

    # Model Fields

    name = models.CharField(max_length=100)    
    desc = models.TextField(max_length=7500)
    track_type = models.CharField(max_length=3,
                                 choices=track_type_choices,
                                 default='ORG')

    track_type_content = models.CharField(max_length=100,blank=True)
    created = models.TimeField(auto_now=True,auto_now_add=False)

    upload = models.FileField(upload_to=generate_user_folder_tracks,validators=[is_mp3])
    albumart = models.ImageField(upload_to=generate_user_folder_art,validators=[is_square_png])

这是我的models.py

    public static int count (String str) {
    int i = 0;
    while(i < str.length()-1 && str.charAt(i)==str.charAt(i+1))
        i ++;

    return ++i;

}
public static int getLongestIndex(String str){
    int output = 0;
    for(int i=0, cnt = 1, counter = 0 ; i<str.length() - 1;i += cnt, cnt = count(str.substring(i)), output = (counter = (cnt > counter ? cnt : counter)) == cnt ? i : output);
    return output;
}

正如您在定义类后的第一行所看到的那样,显然有一个名为“user_name”的变量,当使用我的上传函数时,它应该使用此变量作为文件夹名称。

我很困惑为什么这会引起错误,我做错了什么?

2 个答案:

答案 0 :(得分:2)

这里有一些关于变量范围的严重问题。只需定义名为&#34; user_name&#34;的属性在类的顶部不会自动让您在类的其他地方访问它;你需要通过类本身访问它。通常,您通过self变量执行此操作,该变量是每个方法的第一个参数。

但是,您的许多方法甚至不接受self参数,因此在调用它们时会给出TypeError。最重要的是,您的user_name属性实际上是一个类属性,将由所有User实例共享 - 这显然是一件坏事。你应该把它变成一个Django字段,就像其他属性一样。

最后,当您尝试在其中一种方法中访问request时,您的范围问题会更加严重。同样,您无法访问变量,除非它已传递给该方法(或者在全局范围内可用,请求绝对不是)。所以get_username根本无法运作。

我必须说所有这些都是无关紧要的,因为你得到的错误甚至与你的代码不匹配:你必须在某处访问Track.__user_name才能得到错误。

答案 1 :(得分:0)

你确实有一个变量用户名,但它不是一个字段,这意味着查询设置它看起来像你正在创建但没有找到它

user_name = "no_user"

应该是以下之一

user_name = models.CharField(default='no_user')
user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True)

我在此处建议使用CharField的唯一原因是您在应用中未使用某种形式的授权用户模式。如果这样做,那么你应该使用该模型的外键。