2016-07-02 10 views
1

ジャンゴ1.9.7がレンダリングされたHTMLにdisabled属性が追加されました、そして今、有効な

class PlaceName(models.Model): 
    one = ForeignKey(Place, on_delete=models.CASCADE) 
    ... 

class PlaceNameCreate(CreateView): 
    model = PlaceName 
    fields = ['one', 'name', 'since', ]  

@register.filter 
def disable_one(value): 
    """ 
    Disable selection of "one" field in case of one-to-many relations. 
    """ 
    value = value.replace('name="one"', 'name="one" disabled') 
    value = mark_safe(value) 
    return value 

<form method="post" action=""> 
    {% csrf_token %} 
    <table> 
    {{ form.as_table|disable_one }} 
    </table> 
    <input type="submit" value="Сохранить"/> 
</form> 

この地名は、下位の参考書ではなく、形成、主なものは、場所です。 PlaceView(DetailView)から私はPlaceNameCreateを呼び出し、署名されたPlaceの値を転送し、ユーザーがそれを変更できるようにしたくありません。

これはうまくいきません。このForeignKeyのページに「このフィールドは必須です」というメッセージが表示されます。

テンプレートからdisable_oneフィルタを削除すると、すべて動作します:モデルインスタンスを正常に保存します。

私はFormMixinに掘って、そこ方法get_formに私は

dict: {'instance': None, 'data': <QueryDict: {'since': ['2'], 'csrfmiddlewaretoken': ['6NPIva2Z7XEZzuG2xgWB3sAz0N1SPqZc'], 'name': ['2']}>, 'files': <MultiValueDict: {}>, 'prefix': None, 'initial': {}} 

これは一つのフィールドが空であることを意味していることを確認することができます。フォームが有効でないことは驚くことではありません。フィルタなし

dict: {'instance': None, 'data': <QueryDict: {'one': ['3'], 'since': ['3'], 'csrfmiddlewaretoken': ['6NPIva2Z7XEZzuG2xgWB3sAz0N1SPqZc'], 'name': ['2']}>, 'files': <MultiValueDict: {}>, 'prefix': None, 'initial': {}} 

私はレンダリングされたHTMLをチェックします。唯一の違いは、その属性が「無効」であることです。

任意の亜種が許容されますが、フィルターを使用した方法はドグマではありません。私はちょうどそれが最も簡単なものだと思った。

現在の目標をどのように実現するかを教えてください。値はユーザーに表示されますが、他のバリアントの選択は不可能です。

は後に追加されました:

を示唆したように、私は読み取り専用しようとしました。働いていない。これはレンダリングされたhtmlです。

<!DOCTYPE html> 
... 
<select id="id_one" name="one" readonly> 
<option value="">---------</option> 
<option value="3" selected="selected">664011</option> 
</select> 

まあ、ブラウザでユーザーはまだ二つの値( "---------" と "664011" の間で選択することができます。

を追加し、再び

この質問は重複と見なされましたが、これは純粋な Django質問です。解決策として私に示唆されたのは、要素を無効にしますが、隠し入力に値を保持してからJQueryを使用します。私がしたいこと。

解決策

私は、他の選択肢からユーザーを奪うことに決めました。よりよい解決法が存在しない場合は、これが許容されます。

def get_form(self, form_class): 
    form = super(PlaceNameCreate, self).get_form(form_class) 
    one = self.initial.get('one') 
    choices = ((one.id, one),) 
    form.fields['one'].widget = forms.Select(choices=choices) 
    return form 
+0

? – rnevius

+0

質問の「後で追加された」セクションをご覧ください。私は成功しなかった。 – Michael

+0

[HTMLフォームの読み取り専用のSELECTタグ/入力]の複製があります(http://stackoverflow.com/questions/368813/html-form-readonly-select-tag-input) – rnevius

答えて

0
def get_form(self, form_class): 
    """ 
    For one-to-many relationships. 
    Deprive user of any choice. 
    """ 
    form = super(CreateSubordinate, self).get_form(form_class) 
    one = self.initial.get('one') 
    if one: 
     choices = ((one.id, one),) 
     form.fields['one'].widget = forms.Select(choices=choices) 
    return form 
1

disabled入力値はフォームとともに送信されません。MDNから:

無効

このブール属性は、フォームコントロールは、相互作用のために利用できないことを示しています。特に、無効なコントロールにclickイベントは送出されません。また、無効なコントロールの値はフォームと共に送信されません。

代わりに、あなたはreadonlyを使用して検討する必要があります。

読み取り専用

このブール属性は、ユーザーがコントロールの値を変更することはできませんことを示しています。読み取り専用の代わりに、フィールドが無効になりませなぜ

value = value.replace('name="one"', 'name="one" readonly') 
+0

残念ながら、これは助けにはなりません。質問の「後で追加された」セクションを参照してください。 – Michael

関連する問題