2015-03-13 1 views
0

L'erreur "" doit avoir une valeur pour le champ "dataset" avant que cette relation many-to-many puisse être utilisée. "Lorsque vous tentez d'affecter des valeurs à un ManyToMany field dans mes vues J'ai regardé beaucoup de questions liées ici sur SO qui disent que je dois d'abord sauvegarder mon objet Dataset Je pense que je fais ça ... ce qui ne va pas ?? Ma base de données contient déjà quatre objets.Django ValueError lors de la tentative d'enregistrement de ManyToMany Values ​​à partir d'un formulaire

models.py

class Subject(TimeStampedModel): 
    subject_type = models.CharField(max_length=128, blank=False) 

    def __unicode__(self): 
     return self.subject_type 

class Dataset(TimeStampedModel): 
    dataset_id = models.CharField(max_length=256)  
    dataset_doi = models.CharField(max_length=15)  
    dataset_name = models.CharField(max_length=256, blank=False) 
    dataset_description = models.TextField(blank=False) 
    lab = models.CharField(max_length=256, blank=False) 
    biological_sample = models.CharField(max_length=256, blank=False) 
    subject_type = models.ManyToManyField('Subject', related_name='datasets', blank=True) 
    date_collected = models.DateField(blank=True) 

    collection_facility = models.ManyToManyField('CollectionFacility', related_name='datasets', blank=True) 
    processing_notes = models.TextField(blank=True) 

    release_date = models.DateField() 
    release_asap = models.BooleanField()  
    pdb_code = models.CharField(max_length=256, blank=True)  
    publication_link = models.URLField(blank=True)  

    def create_name(self): 
     self.dataset_name = "%s %s" % (self.biological_sample, self.lab) 

    def save(self, *args, **kwargs): 
     self.dataset_id = self.id 

    def __unicode__(self): 
     return "%s : %s" % (self.dataset_name, self.dataset_id) 

forms.py RegistrationForm:

class RegistrationForm(forms.Form): 

    subject_type = forms.ModelMultipleChoiceField(
     label="Subject", 
     queryset = Subject.objects.all(), 
     widget=forms.CheckboxSelectMultiple(), 
     required = True, 
    ) 

views.py

def create_registration(form): 
    dataset = Dataset() 
    dataset.DOI = "preUpload" 
    dataset.lab = form.cleaned_data['lab'] 
    dataset.biological_sample = form.cleaned_data['sample'] 
    dataset.resource_type = form.cleaned_data['dataset_type'] 
    dataset.dataset_description = form.cleaned_data['dataset_description'] 

    dataset.date_collected = form.cleaned_data['date_collected'] 
    dataset.release_date = form.cleaned_data['release_date'] 
    dataset.release_asap = form.cleaned_data['release_asap'] 

    if form.cleaned_data['pdb_code']: 
     dataset.pdb_code = form.cleaned_data['pdb_code'] 

    if form.cleaned_data['publication_link']: 
     dataset.publication_link = form.cleaned_data['publication_link'] 

    dataset.create_name() 

    dataset.save() # I don't think this save is working? 

    subjects = form.cleaned_data['subject_type'] 
    dataset.subject_type = [x for x in subjects] 

    for facility in form.cleaned_data['facility'] 
     dataset.collection_facility.add(facility) 

    dataset.save() 

    return dataset 


def registration_submit(request): 
    registration_form = RegistrationForm(request.POST) 
    if registration_form.is_valid(): 
     registration = create_registration(registration_form) 
....... 

Répondre

1

Vous avez oublié d'appeler le save() d'origine dans la méthode Dataset.save() overriden.

def save(self, *args, **kwargs): 
    self.dataset_id = self.id 
    super(Dataset, self).save(*args, **kwargs) 
+0

aaaah merci! ok, j'ai ajouté cela, mais je reçois maintenant une valeur DataError trop longue pour le type caractère variable (1) 'J'ai enquêté sur ça maintenant ...? – steph

+0

J'ai trouvé le problème - j'avais max_length à 1 dans le champ resource_type! – steph