2015-03-13 3 views
0

Я получаю сообщение об ошибке «» должно иметь значение для набора данных «field» перед тем, как использовать это отношение «многие ко многим». »При попытке присвоить значения ManyToMany в моих взглядах.Я рассмотрел много связанных вопросов здесь, на SO, которые говорят, что я должен сначала сохранить объект Dataset. Я думаю, что я делаю это ... что происходит не так? Моя база данных уже содержит четыре темы.Django ValueError при попытке сохранить значения ManyToMany из формы

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) 
....... 

ответ

1

Вы забыли позвонить в перекрываться Dataset.save() методом оригинального save().

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

aaaah спасибо! ok, я добавил, что, но теперь я получаю значение DataError слишком долго для символа типа, меняющегося (1). «Я изучаю это сейчас ...? – steph

+0

Я нашел проблему - у меня была max_length, установленная в 1 в поле resource_type! – steph

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