문제

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