Django Form field initial value on failed validation

前端 未结 3 2095
花落未央
花落未央 2021-02-09 11:51

how do I set the value of a field element after a form has been submitted but has failed validation? e.g.

if form.is_valid():
    form.save()
else:
    form.dat         


        
相关标签:
3条回答
  • 2021-02-09 12:24

    The documentation says:

    If you have a bound Form instance and want to change the data somehow, or if you want to bind an unbound Form instance to some data, create another Form instance. There is no way to change data in a Form instance. Once a Form instance has been created, you should consider its data immutable, whether it has data or not.

    I cannot really believe that your code works. But ok. Based on the documentation I would do it this way:

    if request.method == 'POST':
        data = request.POST.copy()
        form = MyForm(data)
        if form.is_valid(): 
            form.save() 
        else: 
            data['myField'] = 'some different data'
            form = MyForm(initial=data)
    
    0 讨论(0)
  • 2021-02-09 12:25

    You can put it in the form class like this:

    class MyForm(forms.Form):
    
        MY_VALUE = 'SOMETHING'
        myfield = forms.CharField(
            initial=MY_VALUE,
            widget=forms.TextInput(attrs={'disabled': 'disabled'})
    
        def __init__(self, *args, **kwargs):
    
            # If the form has been submitted, populate the disabled field
            if 'data' in kwargs:
                data = kwargs['data'].copy()
                self.prefix = kwargs.get('prefix')
                data[self.add_prefix('myfield')] = MY_VALUE
                kwargs['data'] = data
    
            super(MyForm, self).__init__(*args, **kwargs) 
    

    The way it works, is it tests to see if any data has been passed in to the form constructor. If it has, it copies it (the uncopied data is immutable) and then puts the initial value in before continuing to instantiate the form.

    0 讨论(0)
  • 2021-02-09 12:37

    I ended up doing

    if request.method == 'POST':
        new_data = request.POST.copy()
        form = MyForm(data=new_data)
        if form.is_valid(): 
            form.save() 
        else: 
            new_data['myField'] = 'some different data'
    

    Hope this helps someone

    0 讨论(0)
提交回复
热议问题