2016-11-08 2 views
0

Я получаю следующее сообщение об ошибке при попытке создать FilepathДжанго KeyError при попытке форматирования ForeignKey

filepath = '{comp}/utils/locndb/{vehdir}.{filename}'.format(comp,vehdir, filename) 
KeyError: 'comp' 

Я не знаю, как извлечь строку из один ко многим ForeignKey поле

extra.py

def get_file_path(vehicle, filename): 

filepath = '' 

vehdir = vehicle.vehid 
print vehdir 
comp = getattr(vehicle.company, 'user', None) 
print comp 

filepath = 'optiload/{comp}/utils/locndb/{vehdir}.{filename}'.format(comp,vehdir, filename) 
print filepath 

return filepath 

views.py

@login_required 
def loadlocndb(request): 


if request.method == "POST" and request.FILES['locndb']: 
    pks = request.POST.getlist("update") 

    selected_objects = Vehicle.objects.filter(pk__in=pks) 

    vlist = [] 
    for i in selected_objects: 
     vlist.append(i) 
     locnfile = request.FILES['locndb'] 
     fs = FileSystemStorage() 
     filename = fs.save(locnfile.name, locnfile) 
     filename = get_file_path(i, filename) 
     uploaded_file_url = fs.url(filename) 

    return render(request, 'portal/loadlocndb.html',{"vlist":vlist, "uploaded_file_url": uploaded_file_url}) 

models.py

# Create your models here. 
class UserProfile(models.Model): 
    # This line is required. Links UserProfile to a User model instance. 
    user = models.OneToOneField(User) 

    # The additional attributes we wish to include. 
    compName = models.CharField(max_length = 20) 
    milkco = models.IntegerField() 


    # Override the __unicode__() method to return out something meaningful! 
    def __unicode__(self): 
     return self.user.username 

class Vehicle(models.Model): 
    vehid = models.CharField(max_length = 10) 
    company = models.ForeignKey(UserProfile, default = 1) 
    #depot = models.ForeignKey(Depot, default = 1) 
    locndb = models.FileField(upload_to='optload/', default= "setting.MEDIA_ROOT/locndb/LocnDB.csv") 

    class Meta: 
     db_table = "vehicle" 

    def __unicode__(self): 
     return self.vehid 

Я хочу, чтобы импортировать и сохранить файл в FilePath /optiload/{customer}/utils/locndb/{vehicle}/{filename} есть лучший способ сделать это, чем, как я в настоящее время?

ответ

1

Проблема состоит в том, что ваша строка содержит именованные аргументы (например, {comp}), но вы используете позиционные аргументы при вызове format()

Вы можете либо удалить имена из скобок в строке:

filepath = '{}/utils/locndb/{}.{}'.format(comp, vehdir, filename) 

или использовать именованные аргументы при вызове формата:

filepath = '{comp}/utils/locndb/{vehdir}.{filename}'.format(comp=comp, vehdir=vehdir, filename=filename) 
+0

я видел, что ... спасибо бутон – Jim

 Смежные вопросы

  • Нет связанных вопросов^_^