amol rane
amol rane

Reputation: 335

Not able to submit django form

I don't know why my form is invalid. Despite everything seems to be normal. I am not getting any error. sending you screenshot of models.py enter image description here Here is my forms.py

class LeadForm(forms.ModelForm):
    product_queryset = []
    product_name = forms.MultipleChoiceField(choices=product_queryset, required=False)
    contact = PhoneNumberField()
    def __init__(self, *args, **kwargs):
        super(LeadForm, self).__init__(*args, **kwargs)
        self.fields["product_name"].choices = [(pro.get('id'), pro.get('name')) for pro in
                                          Products.objects.all().values('id', 'name')]
    class Meta:
        model = Lead
        exclude = ('created_at','created_by')
        widgets = {
            'date_of_enquiry': DateInput(attrs={'type': 'date'})
        }

Here is my views.py

def create_lead(request):
    u = User.objects.get(username=request.user.get_username())
    if request.method == 'POST':
        print(request.POST)
        # form = LeadForm()
        form = LeadForm(request.POST)
        if form.is_valid():
            print('inside valid')
            form.save(commit=True)
            form.created_by = u
            form.save()
    form = LeadForm()
    context = {"form": form}
    return render(request, 'create_lead.html', context)

Upvotes: 0

Views: 65

Answers (2)

ruddra
ruddra

Reputation: 51978

You should render the errors you are getting, to do that you need to send to template:

def create_lead(request):
    form = LeadForm(request.POST or None)
    if request.method == 'POST':
        if form.is_valid():
            instance = form.save(commit=False)
            instance.created_by = request.user
            instance.save()
            return redirect('/sucess_url')

    context = {"form": form}
    return render(request, 'create_lead.html', context)

And render the errors in template:

{% for field in form %}
    {{ field.errors }}
{% endfor %}

More information can be found in documentation regarding form error rendering.

Probably you should remove the __init__ method from Form class, instead add a __str__ method in Product model:

class Product(models.Model):
   # rest of the code
   def __str__(self):
       return self.name

Upvotes: 1

Vaibhav Mishra
Vaibhav Mishra

Reputation: 227

Please do in your forms.py

class Meta:
    model = Lead
    exclude = ('created_at','created_by')
    fields = ('product_name', [and all your fields which you want to include])
    widgets = {
        'date_of_enquiry': DateInput(attrs={'type': 'date'})
    }

Upvotes: 0

Related Questions