Вопрос

I'm trying to generate form using existing model. It mostly works however the values that I'm getting via get into my url are showing my Providers id and the form displays Provider name. How can I keep displaying name in the form but getting Provider slug instead of id as a value from that form?

model

class Provider(models.Model):
    name = models.CharField(unique=True, max_length=256)
    slug = AutoSlugField(populate_from='name', always_update='True')
    ...

form

class FiltersAndSortingForm(forms.Form): 
    provider = forms.ModelMultipleChoiceField(queryset=Provider.objects.all().order_by('name'), label='Provider', required=False,)

view

def resources(request):
    if request.GET:
        provider = request.GET.getlist('provider', '')  

        qset_provider = Q() 
        for x in provider:
            qset_provider |= Q(provider=x) 

        resources = Resource.objects.filter(inactive=0).filter(qset_provider)
        form = FiltersAndSortingForm()
    else:
        form = FiltersAndSortingForm()
        resources = Resource.objects.filter(inactive=0)

    context = {
                    'resources': resources,
                    'form': form,

                    }
    return render(request, 'mainapp/resources.html', context) 

resources.html

         {% for field in form %}
                    {{ field.label }}
                    {{ field }}
          {% endfor %}
Это было полезно?

Решение

I assume you're using Django 1.6. If so you can do the following according to the docs.

from django.forms import ModelChoiceField

class ProviderModelChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        return obj.slug

Then you need to use the ProviderModelChoiceField in your form.

Otherwise if you're using 1.7, you can use the argument to_field_name. Here are the docs.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top