我正在创建我的第一个模型,我正在创建一个上传系统,该系统上传到一个文件夹,其中包含上传它的用户名。
出于某种原因,当我尝试从模型创建对象时出现此错误:
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”的变量,当使用我的上传函数时,它应该使用此变量作为文件夹名称。
我很困惑为什么这会引起错误,我做错了什么?
答案 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
的唯一原因是您在应用中未使用某种形式的授权用户模式。如果这样做,那么你应该使用该模型的外键。