2016-03-21 35 views
0

ModelForm kullanırken bir çıkmaza girdim.ModelForm ve ilgili nesnelerle ilgili sorun

Ben Django ile birlikte gelen extending the User model yaşıyorum ve aynı zamanda bir ModelForm kullanıyorum, böylece kullanıcı bunu düzenleyebilir.

Aynı örnekte, bu belgede, bu koda sahip olurdum.

class DepartmentForm(ModelForm): 
    class Meta: 
     model = Employee 
     fields = ['department',] 

sorun forms.py models.py

class Employee(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    # In this case, department is optional, so I have set 'blank' and 'null' to True. 
    department = models.CharField(max_length=100, blank=True, null=True) 

görünümü geliyor. Modelin bir örneğini forma kaydetmem gerektiğine karar verdim, böylece save() işlevi onu özelleştirmek zorunda kalmadan çalışır, ancak elbette user.employee henüz oluşturulmadı, dolayısıyla bir hata attı.

views.py

el kabuk aracılığıyla user.employee.department için bir değer ekleyin ve sonra sayfayı yeniden eğer çalışır
def DepartmentView(request): 
    # Here is the issue. 
    department = request.user.employee 
    if request.method == 'POST': 
     # I need to pass the instance here. 
     form = DepartmentForm(request.POST, instance=department) 
     if form.is_valid(): 
      form.save() 
    else: 
     # And also here so it autocompletes the form. 
     form = DepartmentForm(instance=department) 
    return render(request, 'employee.html', {'form': form}) 

, aksi hata aşağıdaki gibidir. Hata biraz farklı olabilir bu yüzden böyle

RelatedObjectDoesNotExist at [something] 
User has no employee. 

Ya da bir şey ... Üzgünüm, ben yukarıdaki kodu deneyin vermedi, ama kavram tamamen aynıdır.

Bu daha önce sorulmuşsa özür dilerim. Bir Google araması yaptım ve bu sorunun cevabını bulamadım.

+0

"CharField" için genellikle "null = True" değerine sahip olmanın gerekli olmadığını unutmayın. Eğer basitçe 'blank = True' varsa, alan isteğe bağlıdır ve değer verilmediğinde boş dizge '' '' kaydedecektir. – Alasdair

cevap

0

Çalışanı db'den almak veya mevcut değilse oluşturmak için get_or_create kullanabilirsiniz.

department, created = Employee.objects.get_or_create(user=request_or_user, department='') 
if request.method == 'POST': 
    form = DepartmentForm(request.POST, instance=department) 
    ... 

Başka bir seçenek, kullanıcı oluşturulduğunda ilgili modelin oluşturulması için bir sinyal kullanmaktır. Sonra çalışanın zaten var olduğunu varsayabilir ve get_or_create yerine request.user.employee kullanabilirsiniz.

+0

Teşekkürler, get_or_create' benim en iyi oyunum gibi görünüyor. Modelde null = True' kullanmamın nedeni, "get_or_create" kullanırken bile alan boşken çok sayıda "IntegrityError" hatası alıyorum. –

+0

Alan için 'unique = True' ayarlamamışsanız, doğruluk hataları aldığınıza şaşırdım. Örneği oluştururken 'departman = ''' ayarlamayı deneyebilirsiniz. – Alasdair

+0

Bu konuda çok fazla endişelenmem, 'null = True' ve' get_or_create' kullanırken iyi çalışır. –