2015-03-12 2 views
2

Я пытаюсь создать форму, которая может быть использована для создания нового экземпляра «LearningObjects», а также для редактирования существующих экземпляров. Кажется, он работает отлично, за исключением того, что когда я редактирую существующий экземпляр, я теряю файловое поле. Поскольку это обязательное поле, он просит загрузить новый файл и, очевидно, я не всегда хочу это делать.Форма Django с файловым полем теряет файл при редактировании экземпляра

Form.py

class LearningObjectuploadform(forms.ModelForm, edit): 
    level = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple,queryset=None,required=False) 
    agebracket =forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple,queryset=None,required=False) 
    pathway = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple,queryset=None,required=False) 
    class Meta: 
     model = LearningObject 
     fields =['title','archivefile','description','tags','pathway','level','subject','agebracket'] 

    def __init__(self, *args, **kwargs): 
     super(LearningObjectuploadform, self).__init__(*args, **kwargs) 
     self.fields['level'].queryset = AssoeLevel.objects.all() 
     self.fields['pathway'].queryset = AssoePathway.objects.all() 
     self.fields['agebracket'].queryset = AgeBracket.objects.all() 

View.py

def createLearningobject(request,learningobject_pk=False): 
if request.method == 'GET': 
    if learningobject_pk: 
     print learningobject_pk 
     instance = LearningObject.objects.get(pk=learningobject_pk) 

     print instance 
     form = LearningObjectuploadform(request.POST or None, request.FILES or None, instance=instance) 
    else: 
     form = LearningObjectuploadform() 
else: 
    form = LearningObjectuploadform(request.POST, request.FILES) 
    if form.is_valid(): 
     learningobject = request.FILES['archivefile'] 
     title = form.cleaned_data['title'] 
     description = form.cleaned_data['description'] 
     tags = form.cleaned_data['tags'] 
     levels = form.cleaned_data['level'] 
     pathways = form.cleaned_data['pathway'] 
     agebrackets = form.cleaned_data['agebracket'] 
     post = LearningObject.objects.create(archivefile=learningobject,title=title, description=description) 
     for tag in tags: 
      post.tags.add(tag) 
     for level in levels: 
      post.level.add(level.pk) 
     for pathway in pathways: 
      post.pathway.add(pathway.pk) 
     for agebracket in agebrackets: 
      post.agebracket.add(agebracket.pk) 
     post.save() 
     return HttpResponseRedirect(reverse('index',)) 
    else: 
     print "form not valid" 
return render(request, 'mediamanager/edit_learningobject.html', {'form': form,}) 

Models.py

class DefaultResource(models.Model): 
# 
# This class is the parent class for all resources in the media manager 
# 
title = models.CharField(max_length=100) 
created_date = models.DateTimeField(auto_now_add=True, auto_now=False) 
edited_date = models.DateTimeField(auto_now_add=False,auto_now=True) 
level = models.ManyToManyField(AssoeLevel) 
agebracket= models.ManyToManyField(AgeBracket) 
pathway= models.ManyToManyField(AssoePathway) 
tags = TaggableManager() 
slug = models.SlugField(max_length=100,editable=False,blank=True) 
updownvotes = RatingField(can_change_vote=True) 
views = models.DecimalField(max_digits=20,decimal_places=2,default=0,blank=True) 
score = models.DecimalField(max_digits=20,decimal_places=4,default=0,blank=True) 
icon = models.CharField(max_length=254,editable=False,blank=True) 
subject = models.ManyToManyField(AssoeSubjects) 

#def return_tags(self): 
# taglist = self.tags.names() 
# return taglist 

def calculate_score(self): 
    score = float(self.updownvotes.likes) - float(self.updownvotes.dislikes) 
    score = score + (float(self.views)**(float(1)/float(2))) 
    self.score = score 
    rounded_score = int(round(self.score)) 
    if rounded_score < -1: 
     return -1 
    else: 
     return rounded_score 

def __unicode__ (self): 
    return self.title 

def save(self, *args, **kwargs): 
    self.calculate_score() 
    if not self.id: 
     self.slug = slugify(self.title) 
    super(DefaultResource, self).save(*args, **kwargs) 


class LearningObject(DefaultResource): 
archivefile = models.FileField(upload_to='static/learningobject/archivefiles/%Y/%m/%d') 
indexpath = models.CharField(max_length=254,editable=False,blank=True) 
description = models.TextField(blank=True) 
def unpackarchive(self): 
    archive = self.archivefile 
    filename = os.path.basename(str(archive)) 

    folder = str(filename).split(".")[0] 
    print folder 
    index_found = "False" 
    with zipfile.ZipFile(archive,"r") as z: 
     for each in z.namelist(): 
      if each == "index.html" or each == "index.htm": 
       index_found = "True" 
      else: 
       pass 
     if not index_found: 
      print "zip file does not contain a valid index.html file" 
     else: 
      path = os.path.join("static","learningobject","unpackedarchives",folder) 
      z.extractall(path) 
      self.findindex(path) 
def findindex(self,path): 

    print path 
    for root, dirnames, filenames in os.walk(path): 
     for filename in fnmatch.filter(filenames, 'index.ht*'): 
      print filename 
      self.indexpath = os.path.join(root, filename) 
    print self.indexpath 

def save(self, *args, **kwargs): 
    self.icon = "/static/images/icons/box.png" 
    self.unpackarchive() 
    super(LearningObject, self).save(*args, **kwargs) 

ответ

2

я столкнулся с подобными проблемами с загрузкой файлов в Джанго формах. Это то, что я надеюсь, что должно помочь вам (если вы готовы изменить атрибут ArchiveFile поля required.)

if request.method == 'GET': 
    if learningobject_pk: 
     print learningobject_pk 
     instance = LearningObject.objects.get(pk=learningobject_pk) 

     print instance 
     form = LearningObjectuploadform(request.POST or None, request.FILES or None, instance=instance) 
     form.base_fields['archivefile'].required = False 

    else: 
     form = LearningObjectuploadform() 
+0

OK. Таким образом, это только изменяет его, если не требуется, когда присутствует learningobject_pk. Думаю, это работает. Не кажется очень изящным, но я проверю его на ожидании других идей. Приветствия. – Thereissoupinmyfly

+0

Во время редактирования. Точно, когда у вас есть learningobject_pk, для которого вы хотите отредактировать запись. –

+0

Хммм. Кажется, он не работает с этим. Есть ли там документация? – Thereissoupinmyfly

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