0
votes

I have the following models.

class Category(MPTTModel):
    name=models.CharField(max_length=75,null=False,blank=False, unique=True)
    parent=TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True)

class ProductGroup(models.Model):
    name = models.CharField(max_length=30,null=False, blank=False)
    category=TreeForeignKey('category.Category', null=False,blank=False)

class Product(models.Model):
    product_group=models.ForeignKey('productgroup.ProductGroup', null=False,blank=False)
    manufacturer=models.ForeignKey(Manufacturer, null=False,blank=False)
    product_type=models.CharField(max_length=2, choices=PRODUCT_TYPE,)
    opening_stock=models.PositiveIntegerField(default=0)

Here's my view and form.

class CreateProduct(CreateView):
    model=Product
    form_class=ProductForm

class ProductForm(forms.ModelForm):
        def __init__(self, *args, **kwargs):
            user = kwargs.pop('user','')
            super(ProductForm, self).__init__(*args, **kwargs)
            self.fields['category']=TreeNodeChoiceField(queryset=Category.objects.all())
            self.fields['category'].required = False
            self.fields['product_group']=forms.ModelChoiceField(queryset=ProductGroup.objects.none())
            original_fields = self.fields

            new_order = OrderedDict()
            for key in ['category','product_group', 'manufacturer', 'product_type', 'wheel_position', 'opening_stock']:
                new_order[key] = original_fields[key]
            self.fields = new_order
        class Meta:
            model = Product     
            fields=['product_group', 'manufacturer', 'product_type', 'wheel_position', 'opening_stock']

GetProductGroups Ajax View

def GetProductGroups(request):
    product_groups=ProductGroup.objects.filter(category__id=request.GET.get('id'))
    to_json = []
    for pg in product_groups:
        # for each object, construct a dictionary containing the data you wish to return
        mydict = {}
        mydict['id'] = pg.id
        mydict['name'] = pg.name
        to_json.append(mydict)

    response_data = json.dumps(to_json)

    return HttpResponse(response_data, content_type="application/json") 

jquery ajax query in product_form.html

<script>
$("#id_category").change(function () {
  var category = $(this).val();
  $.ajax({
    method:'get',
    url: '/ajax/get_product_groups/',
    data: {
      'id': category
    },
    dataType: 'json',
    success: function (data) {

        $('#id_product_group').empty()
        $('#id_product_group').append(
                 $('<option></option>').val(0).html('------------')
             );
        $.each(data, function(key, value){
            $('#id_product_group').append(
                 $('<option></option>').val(value.id).html(value.name)
             );
        });
    }
  });

});
</script>

new url-pattern

url(r'ajax/get_product_groups/', GetProductGroups, name='ajax_get_product_groups'),

The jquery script perfectly fetches the data on Category selection, however when press the submit button I get the following validation error - across product-group filed.

Select a valid choice. That choice is not one of the available choices.

..and the corresponding dropdown gets emptied too.

Can anyone tell me what's wrong with my code?

Thanks.

screenshot of the form after submit

1

1 Answers

0
votes

I didn't know about how to connect the newly created field with the existing one. filter(category=self.data.get('category'))) did the trick

self.fields['product_group']=forms.ModelChoiceField(queryset=ProductGroup.objects.filter(category=self.data.get('category')))