2016-05-31 19 views
0

まずはシナリオを説明しましょう:私はDjango 1.8.7、Python 2.7、およびブートストラップをフロントエンドとしてCRUDで作業しています。このCRUDの一覧で、ユーザーが[追加]ボタンを押したときに、ユーザーが作成したいアイテムの種類を選択するためのコンボが表示されます。ユーザーはオプションを選択し、次のフォームが動的にロードされます。これまでのところ、それは素晴らしい仕事です。私の問題は:ユーザーが選択したコンボは、このフォームのフィールドの1つであり、このフィールドは変更できません。これはテキスト形式の形式でなければなりません。読み取り専用のプロパティを持つDjangoモデルフォーム

例:

現在の形式:

URLがあるときに、フォームがどうあるべきか

Current form

:domain.com/adm/products/add?category_id=2

enter image description here

クエリー文字列にcategory_idが渡されたとき、私はこの値を編集することを許可しません。

私の質問は:これをどのように達成できますか?ビューのCreateViewとフォームのModelFormを使用しています。任意のヒント

+0

あなたの質問は – marcusshep

+0

であるかは不明です。以下の点を明確にしてください。 "ユーザーがオプションを選択しました。"これはあなたが読み取り専用にしようとしているオプションですか?また、この引用されたテキストは正確な "..そして次のフォームが動的に読み込まれる"か、代わりに "...そして次のフォームELEMENTが動的に読み込まれる"かどうか野生の推測をしましょう。 - ユーザーがモーダルボックスで行った最初の選択に基づいて動的にロードされる "フォーム要素値"を意味しますか?本当に情報テキスト出力として表示する必要がありますか? –

+0

@BobbyC私は達成したいことを示すイメージで質問を更新しました。 –

答えて

0

私は方法を見つけました。まず、必要な方法でレンダリングするカスタムウィジェットを作成する必要があります。私の場合は、元のウィジェットは、(選択)コンボだったので、私はこのウィジェットを見つけました:

:あなたはget_initialメソッドを上書きCREATEVIEWで、フィールドのデフォルト値を設定する必要が

class ReadOnlySelect(Select): 
    def render(self, name, value, attrs=None, choices=()): 
     final_attrs = self.build_attrs(attrs, name=name) 
     display = "None" 
     for option_value, option_label in chain(self.choices, choices): 
      if utf8_encode(option_value) == utf8_encode(value): 
       display = option_label 
     output = format_html('<p>%s</p><input type="hidden" value="%s" %s> ' % (display, value, flatatt(final_attrs))) 
     return mark_safe(output) 

第二ステップ

def get_initial(self):   
    category = None   
    if self.request.method == "GET" : 
     # this method sets the initial value for the fields    
     try: 
      category = Category.objects.get(pk=self.request.GET.get('category_id')) 
     except Category.DoesNotExist: 
      raise Http404(_(u"Destination not found.")) 

    return {'category': category} 

あなたは、ウィジェットが現場で使用されるように設定された第3ステップ:Djangoはフォームをロードするとき

class ItemForm(forms.ModelForm): 
    class Meta: 
     model = Item 
     fields = ['category','title' ] 
     widgets = { 
      'category': ReadOnlySelect(), 
     } 

に続いてフィールドが非表示の入力が続いたテキストとして表示されます。

0

を事前に

おかげでちょうどちょうどメタ前に再びフィールドを定義します。

class MyForm(ModelForm): 
    inp_type = forms.CharField(widget = forms.TextInput(attrs={'readonly':'readonly'})) 
    class meta: 
     model = MyModel 
     exclude = ['id'] 
関連する問題