2015-10-07 16 views
11

Bir Kursu kaydetmek ve güncelleştirmek için özel bir CreateView (CourseCreate) ve UpdateView (CourseUpdate) kullanıyorum. Kurs kaydedildiğinde bir eylem yapmak istiyorum. Yeni kursun öğretim üyesi ve kullanıcı arasında çoktan çoğa yeni bir ilişki kuracağım (eğer mevcut değilse).Django CreateView: Kaydetme üzerine eylem gerçekleştirme

Bu nedenle, Kursu kurs olarak kaydetmek istiyorum ve daha sonra bu yeni ilişkiyi oluşturmak için course.faculty'yi kullanmak istiyorum. Bunun gerçekleşmesi için en iyi yer neresi?

Bu formda form_valid içinde yapmaya çalışıyorum, ancak form.instance.faculty kaynağına erişmeye çalışırken hata alıyorum (henüz CourseCreate içinde). Hata iletisi:

"Kurs: ..." bu çoktan çoğa ilişkinin kullanılabilmesi için önce "kurs" alanı için bir değere sahip olması gerekir.

Ayrıca, CourseUpdate'de çalışmıyor. Assist ilişkisi oluşturulmadı. Bunu formda denemeli miyim? Ancak, kullanıcı bilgilerini Form'a nasıl alacağımı bilmiyorum. Teşekkürler.

models.py

class Faculty(models.Model): 
    last_name = models.CharField(max_length=20) 

class Course(models.Model): 
    class_title = models.CharField(max_length=120) 
    faculty = models.ManyToManyField(Faculty) 

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    faculty = models.ManyToManyField(Faculty, through='Assists') 

class Assists(models.Model): 
    user = models.ForeignKey(UserProfile) 
    faculty = models.ForeignKey(Faculty) 

views.py

class CourseCreate(CreateView): 
    model = Course 
    template_name = 'mcadb/course_form.html' 
    form_class = CourseForm 
    def form_valid(self, form): 
     my_course = form.instance 
     for f in my_course.faculty.all(): 
      a, created = Assists.objects.get_or_create(user=self.request.user.userprofile, faculty=f) 
     return super(CourseCreate, self).form_valid(form) 

class CourseUpdate(UpdateView): 
    model = Course 
    form_class = CourseForm 
    def form_valid(self, form): 
     my_course = form.instance 
     for f in my_course.faculty.all(): 
      a, created = Assists.objects.get_or_create(user=self.request.user.userprofile, faculty=f) 
     return super(CourseUpdate, self).form_valid(form) 
+0

deneyin (False = işlemek) 'my_course = form.save ile' my_course = form.instance' yerine ' – Vingtoft

+0

@Vingtoft, teşekkür ederim. Bunu denediğimde, btn'yi yeni bir kurs oluştururken Kaydet'i tıklattığımda hala aynı hatayı görüyorum: "Bu çoktan çoğa ilişkinin kullanılabilmesi için önce Kurs nesnesinin alan için bir değere sahip olması gerekir." "Tabii" bahsinin nereden geldiğini anlamıyorum ... Kurs isimli bir dersim var, ama "kurs" adlı bir alanı yok ve benim görüşümün hiçbirinin " elbette". – Carrie

cevap

22

CreateView ve UpdateView için form_valid() yöntem, daha sonra formu kazandırır başarı url yönlendirir. Kaydedilen nesne ile yönlendirme arasında bir şeyler yapmak istediğinizden, return super() yapmak mümkün değildir.

İlk seçenek super() numaralı telefonu aramamak ve görünümünüzdeki iki çizgiyi çoğaltmaktır. Bunun avantajı, neler olup bittiği çok açık olmasıdır.

def form_valid(self, form): 
    self.object = form.save() 
    # do something with self.object 
    # remember the import: from django.http import HttpResponseRedirect 
    return HttpResponseRedirect(self.get_success_url()) 

İkinci seçenek super() aramaya devam etmek, ancak ilişki güncelledik sonrasına kadar yanıt dönmek kalmamasıdır. Bunun avantajı, kodu super()'da kopyalamamanızdır, ancak dezavantajı, super()'un yaptıklarına aşina olmadığınız sürece, neler olup bittiği açık değildir.

def form_valid(self, form): 
    response = super(CourseCreate, self).form_valid(form) 
    # do something with self.object 
    return response 
+1

Vay, teşekkür ederim, bu çalışıyor (şeffaflık için ilk seçenek ile gittim). Dokümanlara bakmak için çok zaman harcadım ama yine de kendim gibi sorunları gidermek zor. Çok teşekkürler @Alasdair! – Carrie

+1

Şahsen ben de ilk seçeneği tercih ederim. Yardım etti :-) – Alasdair

0

Django'nun Sinyalini kullanmanızı öneririm. Bu, veya güncelleştirmesinin güncelleştirmesi gibi bir Model için bir şey olduğunda tetiklenen bir eylemdir. Bu şekilde kodunuz temiz kalır (form işleme sırasında iş mantığı yok) ve 'un'u kaydetmesinden sonra tetiklendiğinden eminsiniz.

#views.py 
from django.dispatch import receiver 
... 

@receiver(post_save, sender=Course) 
def post_save_course_dosomething(sender,instance, **kwargs): 
    the_faculty = instance.faculty 
    #...etc 
İlgili konular