How To Prepopulate An Django Update Form And Write It Back To The Database
Solution 1:
According to https://docs.djangoproject.com/en/dev/ref/forms/api/#dynamic-initial-values, you can use the initial attribute when instantiating forms in order to prepropulate your forms.
defupdate_advert(request, id):
    ifnot request.user.is_authenticated():
        return render(request, 'forum/login.html')
    else:
        advert_obj = get_object_or_404(Advert, pk=id)
        if request.method == 'POST':
            form = AdvertForm(request.POST orNone, request.FILES orNone, instance=advert_obj)
            if form.is_valid():
                form.save()
                return redirect('forum:user_account')
        else:
            # Prepopulation happens here:
            data = {"some_field": advert_obj.some_val} # Insert all the values of advert_obj here and their field names as keys.
            form = AdvertForm(initial=data) 
        context = {'form': form}
        return render(request, 'forum/update_advert.html', context)
In your AdvertForm, put this code:
classAdvertForm(forms.ModelForm):
    def__init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(AdvertForm, self).__init__(*args, **kwargs)
    defsave(self, commit=True):
        instance = super(AdvertForm, self).save(commit=False)
        instance.user = self.request.user
        if commit:
            instance.save()
        return instance
The overriding save method simply does what you were doing in the views to link up the request.user to the instance, however I have placed that code in the form class to keep your views simple.
Also, I can see one confusing (but not vital) issue - you have mixed up the variable names.
When calling form = get_object_or_404(Advert, pk=id), this should return to a variable name such as advert or something similar. Not form as that can be confusing as we are returning a model object not a form. Similarly, form.save(commit=False) returns an "instance" not a model form. This won't solve your problem but should be pointed out for more clarification on what exactly is being returned and how you should then name your variables.
Post a Comment for "How To Prepopulate An Django Update Form And Write It Back To The Database"