การตั้งค่าที่เลือกในแบบฟอร์ม Django ChoiceField


108

นี่คือการประกาศเขตข้อมูลในรูปแบบ:

max_number = forms.ChoiceField(widget = forms.Select(), 
    choices = ([('1','1'), ('2','2'),('3','3'), ]), initial='3', required = True,)

ฉันต้องการตั้งค่าเริ่มต้นให้เป็น3และดูเหมือนจะไม่ได้ผล ฉันเล่นเกี่ยวกับพารามิเตอร์คำพูด / ไม่มีเครื่องหมายคำพูด ฯลฯ ... แต่ไม่มีการเปลี่ยนแปลง

ใครช่วยให้คำตอบที่ชัดเจนถ้าเป็นไปได้? และ / หรือการปรับแต่งที่จำเป็นในข้อมูลโค้ดของฉัน?

ฉันใช้ Django 1.0


ฉันเคยสงสัยในสิ่งเดียวกัน "เริ่มต้น" ไม่สามารถใช้งานร่วมกับตัวเลือกในเวอร์ชันท้ายรถล่าสุดได้เช่นกัน
Ty.

คำตอบ:


115

ลองตั้งค่าเริ่มต้นเมื่อคุณสร้างอินสแตนซ์แบบฟอร์ม:

form = MyForm(initial={'max_number': '3'})

3
เป็น'3'ที่สอดคล้องกับค่าแรกของ tuple หรือครั้งที่สองหรือไม่
Bestasttung

5
tuples แทนคู่ (value, label) สำหรับตัวเลือกและคุณต้องการระบุค่าเริ่มต้นดังนั้น '3' จึงหมายถึงรายการแรก
ทอม

95

นี้ไม่ได้สัมผัสกับคำถามทันทีที่มือ แต่ Q / ChoiceFieldขึ้นมาสำหรับการค้นหาที่เกี่ยวข้องกับการพยายามที่จะกำหนดค่าที่เลือกไป

หากคุณได้เรียกsuper().__init__ในคลาส Form ของคุณแล้วคุณควรอัปเดตform.initialพจนานุกรมไม่ใช่field.initialคุณสมบัติ ถ้าคุณศึกษาform.initial(เช่นprint self.initialหลังจากที่โทรไปsuper().__init__) ก็จะมีค่าสำหรับทุกฟิลด์ การมีค่าNoneในคำสั่งนั้นจะแทนที่field.initialค่านั้น

เช่น

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        # assign a (computed, I assume) default value to the choice field
        self.initial['choices_field_name'] = 'default value'
        # you should NOT do this:
        self.fields['choices_field_name'].initial = 'default value'

3
หากคุณไม่เข้าใจคำตอบนี้โปรดอ่านgotchas แบบฟอร์ม django
ChillarAnand

1
ฉันไม่แน่ใจว่าเป็นเพราะคำตอบนี้เก่ามากจนใช้ไม่ได้อีกต่อไป แต่ฉันไม่สามารถทำให้โซลูชันนี้ใช้งานได้ ฉันได้ลองทุกอย่างที่กล่าวมาข้างต้นแล้ว แต่ก็ยังไม่ได้รับความรัก ฉันถามคำถามนี้อีกครั้งที่นี่: stackoverflow.com/questions/52191096/… หากคำตอบยังคงเหมือนเดิมโปรดแจ้งให้เราทราบว่ามีอะไรผิดปกติกับรหัสของฉัน ขอบคุณ!
Lehrian

48

คุณยังสามารถทำสิ่งต่อไปนี้ ในคลาสฟอร์มของคุณ def:

max_number = forms.ChoiceField(widget = forms.Select(), 
                 choices = ([('1','1'), ('2','2'),('3','3'), ]), initial='3', required = True,)

จากนั้นเมื่อเรียกแบบฟอร์มในมุมมองของคุณคุณสามารถตั้งค่าตัวเลือกเริ่มต้นและรายการตัวเลือกแบบไดนามิกได้

yourFormInstance = YourFormClass()

yourFormInstance.fields['max_number'].choices = [(1,1),(2,2),(3,3)]
yourFormInstance.fields['max_number'].initial = [1]

หมายเหตุ: ค่าเริ่มต้นจะต้องเป็นรายการและตัวเลือกต้องเป็น 2-tuples ในตัวอย่างของฉันด้านบนฉันมีรายการ 2-tuples หวังว่านี่จะช่วยได้


5
บางทีควรสังเกตว่าค่าของinitialอ้างอิงถึงคีย์ของรายการที่จะเลือกไม่ใช่ดัชนี ฉันพยายามสองสามครั้งในการทำงานนี้!
BigglesZX

20

ฉันพบปัญหานี้เช่นกันและพบว่าปัญหาอยู่ในเบราว์เซอร์ เมื่อคุณรีเฟรชเบราว์เซอร์กำลังเติมฟอร์มอีกครั้งด้วยค่าเดิมโดยไม่สนใจฟิลด์ที่เลือก หากคุณดูแหล่งที่มาคุณจะเห็นว่าค่าที่เลือกนั้นถูกต้อง หรือวางเคอร์เซอร์ในช่อง URL ของเบราว์เซอร์แล้วกด Enter ซึ่งจะโหลดแบบฟอร์มใหม่ตั้งแต่เริ่มต้น


1
แค่ fyi สิ่งนี้ยังคงเกิดขึ้นใน FF6 การกดปุ่มรีเฟรชไม่เพียงพอ แต่ในปุ่มรีเฟรชของ Google Chrome ก็เพียงพอแล้วไม่จำเป็นต้องไปที่แถบที่อยู่
mhd

1
ฉันคิดว่ามันจะเกิดขึ้นใน Firefox เสมอ เป็นพฤติกรรมที่ตั้งใจไว้
thepeer

ยังคงเกิดขึ้นใน Chrome 83 คุณช่วยชีวิตฉันไว้!
lapin

7

ทั้งสองคำตอบของ Tom และ Burton ได้ผลสำหรับฉันในที่สุด แต่ฉันมีปัญหาเล็กน้อยในการหาวิธีนำไปใช้กับไฟล์ModelChoiceField.

เคล็ดลับเพียงอย่างเดียวคือตัวเลือกจะถูกจัดเก็บเป็น(<model's ID>, <model's unicode repr>)สิ่งที่สองดังนั้นหากคุณต้องการตั้งค่าการเลือกโมเดลเริ่มต้นคุณจะส่งIDของโมเดลเป็นค่าเริ่มต้นไม่ใช่ตัววัตถุเองหรือเป็นชื่อหรือสิ่งอื่นใด จากนั้นก็ทำได้ง่ายๆดังนี้:

form = EmployeeForm(initial={'manager': manager_employee_id})

อีกทางเลือกหนึ่งที่initialสามารถละเว้นอาร์กิวเมนต์แทนบรรทัดพิเศษด้วย:

form.fields['manager'].initial = manager_employee_id

1
โค้ดบรรทัดที่สองของคุณทำงานได้อย่างไม่มีที่ติในกรณีที่เกิดขึ้นได้ยากซึ่งคุณต้องกำหนดค่าเริ่มต้นของแบบฟอร์มหลังจากการGETร้องขอและตั้งค่าจากภายในมุมมอง
kstratis

3

Dave - โชคดีในการแก้ไขปัญหาเบราว์เซอร์หรือไม่? มีวิธีบังคับให้รีเฟรชหรือไม่?

สำหรับปัญหาเดิมให้ลองทำสิ่งต่อไปนี้เมื่อเริ่มต้นฟอร์ม:

def __init__(self, *args, **kwargs):
  super(MyForm, self).__init__(*args, **kwargs)   
  self.base_fields['MyChoiceField'].initial = initial_value

1
นี่ดูไม่สวยงาม อ้างจาก django 1.3, form.py:93:Instances should always modify self.fields; they should not modify self.base_fields.
Tomas Tomecek

1

เพื่อให้แน่ใจว่าฉันต้องดูว่าคุณกำลังสร้างแบบฟอร์มอย่างไร ค่าเริ่มต้นจะใช้เฉพาะในรูปแบบที่ไม่ถูกผูกไว้หากถูกผูกไว้และค่าสำหรับฟิลด์นั้นจะไม่รวมจะไม่มีการเลือก


-4

ลองใช้มันได้ผลสำหรับฉันฉันได้เพิ่มสิ่งนี้ใน models.py

options = (
    ('1','1'),
    ('2','2'),
    ('3','3')
)

max_number = forms.ChoiceField(max_length = 2, choices = options, default ='3')

6
สิ่งนี้ทำให้เกิดข้อผิดพลาดใน django 1.8.1: TypeError at /my/url/ __init__() got an unexpected keyword argument 'default' Request Method: GET Request URL: http://localhost:8000/my/url/ Django Version: 1.8.1 Exception Type: TypeError Exception Value: __init__() got an unexpected keyword argument 'default'
juliocesar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.