2012-05-30 32 views
5

Lütfen bunu bir soru göz önünde bulundurun. Belki birisi aşağıdaki çözümlerinden birini kullanacaktır.Django kullanıcısı HiddenInput vs. Sınıf Tabanlı Görünümlerle doğrudan görüntülemeye kaydetme

ForeignKey(User) alanı içeren birkaç modelim var. Sınıf tabanlı oluşturma görünümlerim, jenerik CreateView'dan türetilmiştir. Yeni bir nesne eklerken ilişkili kullanıcıyı kaydetmek için iki seçenek vardır

:

  1. form_valid yöntemi geçersiz kılarak görünümlerde formu kaydetme; Gizli alanında kullanıcı kimliği saklı (ve açıkta) ile formu kaydetme

    class CreateOfferView(CreateView): 
    
        model = Offer 
        form_class = SomeModelFormWithUserFieldExcluded 
    
        def form_valid(self, form): 
         instance = form.save(commit=False) 
         instance.user = self.request.user 
         instance.save() 
    
  2. bu user_id göstermiyor (ve diğer burada maruz kalmamalıdır verileri belirtilmeyen). İşte zor kısmı. Kullanıcı alanıyla daha fazla model var ... Bir form oluştururken, kullanıcı alanını başlangıçta (o anda oturum açmış) kullanıcı ile doldurmam gerekiyor ve ayrıca bu alanı gizli tutmam gerekiyor. Bu amaçla ben kullandım benim OwnFormMixin

    class OwnFormMixin(object): 
    
        def get_form(self, form_class): 
         form = super(OwnFormMixin, self).get_form(form_class) 
         form.fields['user'].widget = forms.HiddenInput() 
    
        def get_initial(self): 
         initial = super(OwnFormMixin, self).get_initial() 
         initial['user'] = self.request.user.pk 
         #I could also do this in get_form() with form.fields['user'].initial 
    
    class CreateOfferView(OwnFormMixin, CreateView): 
        model = Offer 
        form_class = SomeModelFormWithAllFields 
    

vardır daha CreateXXXView kullanarak OwnFormMixin .. Eğer formlarda kullanıcı verileri kaydetmek nasıl

?

Doğrudan görünümlerinize kaydederek gizli mi? Artıları/eksileri nelerdir? Eğer kullanıcıların o ForeignKeyField değiştirmek izin sürece

+0

Neden doğrulamada request.user kullanıyorsunuz? POST a'ya başka bir kullanıcıdan yanıt verme olasılığı var mı? Neden django Kullanıcı verileriyle ilgili herhangi bir formu veya herhangi bir görünür parçayı oluşturabiliriz. Bu bir potansiyel güvenlik açığı ... – garmoncheg

cevap

2

, bir formda dahil etmeyi neden yok - Ben senin ilk ModelForm dışında kullanıcı alanını tutmak için exclude kullanarak çözümüne ve ayar ile gitmek istiyorum Kullanıcı request.user'dan. Aslında, Django documentation now has an example along these exact lines.

Sen değil dahili kullanıcı kimliklerinin açığa çıkmasını, user_id parametrenin manipülasyon karşı güvence altına almak zorunda değildir ve vs Güncelleme durumlarda oluşturma farklı dert değil avantajına sahip. Hafif bir dezavantaj ise, bir nesnenin ilişkili User'u değiştirme yeteneğine ihtiyacınız olursa, yeniden başlatmanız gerekir.

İlgili konular