2011-04-18 5 views
18

imkanı veren tek formunu göstermektir:Django'da bir Model Çerçevesine nasıl bir Yabancı Anahtar Alanı ekleyebilirim? Ben yapmak istiyorum ne

  • (Document modelinden) bir belge başlık girin
  • Listeden bir açılır onların user_defined_code seçimlerden biri (nüfuslu Code modelinde saklanan bir unique_code içinde UserDefinedCode modeli)
  • Tipi()

tarafından ben ön plana için alanlar görüntüleme hakkında gitmek nasıl emin değilim Bir formdaki temel ilişkileri yoksay. Bir bakışta, geçerli document nesnesine ilişkin ilgili nesnelere erişmek için document.code_set (örneğin) kullanabileceğinizi biliyorum, ancak bunu bir ModelForm'a nasıl uygulayacağımı bilmiyorum.

Benim modelim:

class UserDefinedCode(models.Model): 
    name = models.CharField(max_length=8) 
    owner = models.ForeignKey(User) 

class Code(models.Model): 
    user_defined_code = models.ForeignKey(UserDefinedCode) 
    unique_code = models.CharField(max_length=15) 

class Document(models.Model): 
    title = models.CharField(blank=True, null=True, max_length=200) 
    code = models.ForeignKey(Code) 
    active = models.BooleanField(default=True) 

Benim ModelForm

class DocumentForm(ModelForm): 
    class Meta: 
     model = Document 

cevap

27

Eğer forms.ModelChoiceField kullanmak ve bunu bir Sorgu Kümesi geçebilir, formda bir yabancı anahtar alanını göstererek getirmedi. böylece

, forms.py:

class DocumentForm(forms.ModelForm): 
    class Meta: 
     model = Document 

    def __init__(self, *args, **kwargs): 
     user = kwargs.pop('user','') 
     super(DocumentForm, self).__init__(*args, **kwargs) 
     self.fields['user_defined_code']=forms.ModelChoiceField(queryset=UserDefinedCode.objects.filter(owner=user)) 

views.py: Sorunuza dan

def someview(request): 
    if request.method=='post': 
     form=DocumentForm(request.POST, user=request.user) 
     if form.is_valid(): 
      selected_user_defined_code = form.cleaned_data.get('user_defined_code') 
      #do stuff here 
    else: 
     form=DocumentForm(user=request.user) 

    context = { 'form':form, } 

    return render_to_response('sometemplate.html', context, 
     context_instance=RequestContext(request)) 

: Ben kullanabileceğiniz bir görünümde biliyorum

document.code_set (örneğin) için geçerli belge nesnesine ilgili nesnelere erişebilir, ancak ben değil, bu ModelForm'a nasıl uygulanacağından emin değilsiniz. FK ilişki belgeleriniz modelinde tanımlanmış olduğundan

Aslında, Document nesneleri .code_set olmazdı. Code'a çoktan bire bir ilişki tanımlamakta, yani Code nesnesinde Document nesnesi olabileceği anlamına gelir. Code nesneleriniz .document_set olur. Belge nesnesinden yapabilecekleriniz, Code'un document.code kullanarak ilişkili olduğu erişimdir.

düzenleme: Bu sizin aradığınız şeyi yapacağını düşünüyorum. (Denenmemiş)

forms.py:

class DocumentForm(forms.ModelForm): 
    class Meta: 
     model = Document 
     exclude = ('code',) 

    def __init__(self, *args, **kwargs): 
     user = kwargs.pop('user','') 
     super(DocumentForm, self).__init__(*args, **kwargs) 
     self.fields['user_defined_code']=forms.ModelChoiceField(queryset=UserDefinedCode.objects.filter(owner=user)) 
     self.fields['unique_code']=forms.CharField(max_length=15) 

views.py:

def someview(request): 
    if request.method=='post': 
     form=DocumentForm(request.POST, user=request.user) 
     if form.is_valid(): 
      uniquecode = form.cleaned_data.get('unique_code') 
      user_defined_code = form.cleaned_data.get('user_defined_code') 
      doc_code = Code(user_defined_code=user_defined_code, code=uniquecode) 
      doc_code.save() 
      doc = form.save(commit=False) 
      doc.code = doc_code 
      doc.save() 
      return HttpResponse('success') 
    else: 
     form=DocumentForm(user=request.user) 

    context = { 'form':form, } 

    return render_to_response('sometemplate.html', context, 
     context_instance=RequestContext(request)) 

aslında muhtemelen bunun yerine sizin Kod nesnesi oluştururken get_or_create kullanmak istiyorum.

doc_code = Code(user_defined_code=user_defined_code, code=uniquecode) 
+0

Yardımlarınız için teşekkürler.ModelChoiceField için belgeleri okudum ve şimdi mantıklı. 'Unique_code' alanı için CharField'ı (sorgumun üçüncü kurşunu) nasıl görüntüleyeceğimi biliyor musunuz? Modellerimi okumayı kolaylaştırmak için birazcık inceledim, ancak temelde bilgisayar tarafından oluşturulan benzersiz bir belge kodu atanmış bir belgem var. Her kullanıcı, sahip oldukları tüm belgeler için belge koduna bir önek olarak eklenmiş ayrı bir kullanıcı kodu oluşturabilir, dolayısıyla çoklu modellerin nedeni. –

+0

@Ben S Tamam bir bakayım. Mesajımı düzenlerim. – DTing

+0

Bu harika çalıştı. Yardım ettiğin için teşekkür ederim. –

İlgili konular