I managed to get the code functional. I haven't done extensive testing but it's certainly working right now with your code plus some of my own fixes. I should read the documentation more carefully in the future.
Thanks again for the super detailed response James. On Wednesday, October 25, 2017 at 7:50:58 PM UTC-4, James Schneider wrote: > > > > On Wed, Oct 25, 2017 at 11:29 AM, Jack <[email protected] <javascript:>> > wrote: > >> I am building a search form where the user inputs 3 values on a form, and >> I search the database for all records that match the 3 inputs. Right now I >> am stuck on the user input part. >> >> If you look at my *urls.py*, you will see that I tried to put 3 keywords >> arguments in there. Then I tried to pass the 3 keyword arguments in the >> url tag with variables from my *forms.py*. I think this is where things >> went wrong but I'm not sure. I don't know if the .html file can use >> variables from *forms.py* >> >> Basically what I'm trying to do is to take the 3 user inputs, and pass >> them as arguments in the URL. Right now I'm getting: >> >> NoReverseMatch at / >> >> Reverse for 'search-results' with keyword arguments '{'pt': '', 'nb': '', >> 'nw': ''}' not found. 1 pattern(s) tried: >> ['search?(?P<pt>\\w+)&(?P<nb>\\w+)&(?P<nw>\\w+)'] >> >> >> >> *urls.py* >> url(r'^search?(?P<pt>\w+)&(?P<nb>\w+)&(?P<nw>\w+)', >> views.IndexSearchResults.as_view(), name='search-results') >> >> > This is not the correct usage of the URL dispatcher. It should look > something like this: > > url(r'^search$', views.IndexSearchResults.as_view(), name='search-results') > > The URL dispatcher does not match on GET arguments within the URL, that's > left for the request object to parse. > > > https://docs.djangoproject.com/en/1.11/topics/http/urls/#what-the-urlconf-searches-against > > > > *views.py* >> class IndexSearchResults(generic.ListView): >> template_name = 'search-results.html' >> >> > The view is where your GET arguments will be processed. Note that if you > are submitting the form directly to the URL above, then no validation of > the form values will be performed. If you want those values to be > validated, you should submit to a FormView to validate the results and > redirect to this search page with the GET arguments in tow. I'd imagine > that both strategies are common, since sending bad values to search against > usually just results in bad searches. The ORM takes care of most of the > security concerns in this case. > > You will want to override get_queryset() to add in your GET arguments for > filtering after retrieving them from the request object. The GET arguments > are automatically captured in to a QueryDict attached to the request: > > > https://docs.djangoproject.com/en/1.11/ref/request-response/#querydict-objects > > So, in your IndexSearchResults view: > > def get_queryset(self): > queryset = super().get_queryset() > > # I can do something fancy with lists of tuples to cut down on the > code, but this is more readable > pt = self.request.GET.get('pt') > nb = self.request.GET.get('nb') > nw = self.request.GET.get('nw') > > if pt: > queryset = queryset.filter(property_type=pt) > if nb: > queryset = queryset.filter(number_of_bedrooms=nb) > if nw: > queryset = queryset.filter(number_of_washrooms=nw) > > return queryset > > > This should return a queryset to the view that will filter down the list > of objects matching the GET arguments. > > > >> >> *models.py* >> Class BuyerListing(models.Model): >> BEDS_OPTION = ( >> (BEDS_0, '0 [Studio/Bachelor]'), >> (BEDS_1, '1'), >> (BEDS_1_1, '1+1'), >> (BEDS_2, '2'), >> (BEDS_2_1, '2+1'), >> (BEDS_3, '3'), >> (BEDS_3_1, '3+1'), >> (BEDS_4, '4'), >> (BEDS_5, '5'), >> (BEDS_5_1, '5+'), >> ) >> >> WASH_OPTION = ( >> (WASH_1, '1'), >> (WASH_2, '2'), >> (WASH_3, '3'), >> (WASH_4, '4'), >> (WASH_5, '5'), >> (WASH_5_1, '5+'), >> ) >> >> PROPERTY_TYPE = ( >> (CONDO_APARTMENT, 'Condo Apartment'), >> (DETACHED_HOUSE, 'Detached House'), >> (SEMI_DETACHED, 'Semi-detached'), >> (TOWNHOUSE, 'Townhouse'), >> ) >> >> property_type = models.CharField(max_length=50) >> number_of_bedrooms = models.CharField(max_length=50, default=BEDS_0) >> number_of_washrooms = models.CharField(max_length=50, default=WASH_1) >> > > This might be correct, but generally you would use an IntegerField or > FloatField here rather than CharFields for the number of beds/baths. I'm > not aware of any exceptions where a number would not be used, but you may > know of some. Searching will be slightly faster using real number fields, > and you'll be able to filter using queries for 'more than 2 bedrooms' etc., > which you can't do with CharFields. I'd imagine that is a desired feature. > > -James > -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/django-users. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/e1bdd963-68ed-4d4a-96e2-be68912d01d6%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.

