2015-11-21 11 views
18

Yeni oluşturulmuş bir ModelForm'dan bir birincil anahtarı aynı görünümdeki başka bir form alanına geçirmem gerekiyor ancak bir hata alıyorum. Bunu yapmak için herhangi bir öneriniz var mı? Geçmişte benziyor, bu yanıtın olacaktır: belgelerineKaydedilmemiş ilgili nesne nedeniyle veri kaybını önlemek için() yasak

def contact_create(request): 
    if request.method == 'POST': 
     form = ContactForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect(reverse(contact_details, args=(form.pk,))) 
    else: 
     form = ContactForm() 

, bu yeni Django sürümü > 1.8.3

p3 = Place(name='Demon Dogs', address='944 W. Fullerton') Restaurant.objects.create(place=p3, serves_hot_dogs=True, serves_pizza=False)
Traceback (most recent call last):
...
ValueError: save() prohibited to prevent data loss due to unsaved related object 'place'.

ben alıyorum nasıl Bu edilir olup bitenler benim görünümden pk:

my_id = "" 
if form.is_valid(): 
    # deal with form first to get id 
    model_instance = form.save(commit=False) 
    model_instance.pub_date= timezone.now() 
    model_instance.user= current_user.id 
    model_instance.save() 
    my_id = model_instance.pk 

if hourformset.is_valid(): 
    hourformset.save(commit=False) 
    for product in hourformset: 
     if product.is_valid(): 
      product.save(commit=False) 
      product.company = my_id 
      product.save() 
else: 
    print(" modelform not saved") 
return HttpResponseRedirect('/bizprofile/success') 
+1

Birkaç şey: 1) neden sadece current_user yerine current_user.id öğesine model_instance.user ayarlıyorsunuz, 2) product.company = my_id yerine product.company = model_instance ve 3) hata nedir (Aldığınız ValueError mı?) ve kodda hangi satırdasınız? –

+0

hata her zaman product.save() konumunda. Kaydedilmemiş ilgili nesne 'şirket' nedeniyle veri kaybını önlemek için – Godfrey

+0

save() yasaklanmıştır. Önerilerinizi zaten uyguladım. – Godfrey

cevap

8

Bu Django 1.8'de tanıtıldı. Önceden kaydedilmiş örneği One-To-One ilişkisine atayabilirsiniz ve başarısızlık durumunda sessizce atlandı. Django 1.8'ten başlayarak bu durumda hata mesajı alacaksınız. Django 1.7 -> 1.8 yükseltmesinin bir documentation kontrol edin.

Diyor ki daha fazla ayrıntı istiyorsanız

Assigning unsaved objects to a ForeignKey, GenericForeignKey, and OneToOneField now raises a ValueError.

, sen save yöntem django.db.models.base kontrol edilebilir: Bir kısmı kısmı:

for field in self._meta.concrete_fields: 
    if field.is_relation: 
     # If the related field isn't cached, then an instance hasn't 
     # been assigned and there's no need to worry about this check. 
     try: 
      getattr(self, field.get_cache_name()) 
     except AttributeError: 
      continue 
     obj = getattr(self, field.name, None) 
     # A pk may have been assigned manually to a model instance not 
     # saved to the database (or auto-generated in a case like 
     # UUIDField), but we allow the save to proceed and rely on the 
     # database to raise an IntegrityError if applicable. If 
     # constraints aren't supported by the database, there's the 
     # unavoidable risk of data corruption. 
     if obj and obj.pk is None: 
      raise ValueError(
       "save() prohibited to prevent data loss due to " 
       "unsaved related object '%s'." % field.name 
      ) 

Son 5 satır bu hatadır nerede kaldırdı. temelde ilgili olmayan obj ile ilgili olmayan obj.pk == None ve ValueError yükseltilecektir.

7

o basit:

p3 = Place(name='Demon Dogs', address='944 W. Fullerton') 
p3.save() # <--- you need to save the instance first, and then assign 
Restaurant.objects.create(
    place=p3, serves_hot_dogs=True, serves_pizza=False 
) 
+0

Modelform örneğini kaydetmeme rağmen aynı değer hatası alıyorum. Koduma bak ve neden bunu anladığımı söyle: kaydedilmemiş ilgili nesne 'şirket' nedeniyle veri kaybını önlemek için kaydet(). – Godfrey

3

Yanıtlandı - Sorun, boş veya değişmeyen formları kaydetmeyen django'dan kaynaklandı. Bu, kaydedilmemiş formlardaki boş alanlara yol açtı. Sorun, yabancı alanlardaki boş alanlara izin vererek, aslında tüm alanlar olarak belirlenmiştir. Bu şekilde, boş veya değişmemiş formlar, kaydetme sırasında herhangi bir hata döndürmedi.

FYI: @wolendranh yanıtına bakın.

+0

Sadece bunu okuyan herkesi tanımak için.Özellikle ForeignKeys için null değere sahip olmak kötü bir fikirdir. Sadece null değerlerini kullanın (genellikle asla) – llazzaro

+0

@llazzaro, neden bu durumda, iddiaya bazı açıklamalar veya referanslar sağlayabilir misiniz. – unlockme

+0

@llazzaro, projenin izlerini ve çıkışlarını unuttum, ancak haftanın her günü kullanıcılara yönelik yedi form otomatik olarak oluşturuyordum. Kullanıcıların her gün için açık ve kapanış saatlerini doldurması gerekiyordu. Bazı günler doğal olarak boş bırakıldı veya değişmedi. Sanırım benim altımdaki cevap bunu detaylı olarak açıklıyor. Soru, bu boş formlarla nasıl başa çıkılacağıydı. – Godfrey

İlgili konular