Home > Net >  Django form not rendering? (No Model)
Django form not rendering? (No Model)

Time:06-22

So my Django form is not rendering in the html.

all I'm able to see is the Get Rank text. I'm not sure if it's because I don't have a model or maybe it's something wrong with my html?

If you need to see anything else let me know not sure what's wrong, I also tried just doing it all inside of the home function but then it doesn't render the html at all.

Side question - Also I only plan on grabbing the users name, and the tag outside their name ("JohnDoeNA#1") so I probably use a get method correct?

EDIT: Fixed the button not working now only thing not rendering is the form. (Mis-spelling)

Updated Code to be correct.

views.py: 
from urllib import response
from django.shortcuts import render
from django.http import HttpResponse
import requests
from .forms import SearchUser
import json
# Create your views here.


def index(response):
    return render(response, "main/base.html")


def home(response):
    form = SearchUser()
    data = requests.get(
        'https://americas.api.riotgames.com/riot/account/v1/accounts/by-riot-id/ReallyBlue/NA1?api_key=RGAPI-ee8fcdce-05c5-4ad4-b909-8efa722b1134')
    userid = data.json()['puuid']
    return render(response, "main/home.html", {
        'form': form,
        'userid': userid,
        # 'mmr': apidata['rank']
    })

forms.py:

from django import forms


class SearchUser(forms.Form):
    name = forms.CharField(label="Name", max_length=200)

urls.py:

from django.urls import path
from . import views


urlpatterns = [
    path("", views.index, name="index"),
    path("home/", views.home, name="home")
]

home.html:

{% extends 'main/base.html'%}


{% block content %}
    <h2>Valorant Ranked Checker</h2>
    <form method="post" action="/home/">
        {{form}}
        <button type="submit", name="search">
            Get rank
        </button>
    </form>
    <p><strong>{{userid}} - {{mmr}}</strong></p>
{% endblock %}

base.html:

<!DOCTYPE html>
<head>

    <title>Blue's Valorant Ranked Checker</title>
</head>

<body>
    <div id="content", name="content">
        {% block content %}
        {% endblock %}
    </div>
</body>
</html>

CodePudding user response:

You have two main issues here:

  1. You were rendering your base template as your root directory (base.html) and therefore Django's template inheritance wasn't working correctly. You'll want to render the child template (the one that includes extends) if you want template inheritance to work properly.
  2. You need to pass your Django form (SearchUser) to the render function of the view

I recommend making these changes:

====================

Remove reference to the index view in your urls.py as we don't need it. Instead, use your home child template as your root view:

urls.py:

from django.urls import path
from . import views

urlpatterns = [
    path("", views.home, name="home")
]

====================

Remove the no longer needed index function from views.py. You'll also want to pass reference to your form (SearchForm) inside of Django's render shortcut function.

views.py:

from urllib import response
from django.shortcuts import render
from django.http import HttpResponse
import requests
from .forms import SearchUser
import json
# Create your views here.

def home(response):
    data = requests.get(
        'https://americas.api.riotgames.com/riot/account/v1/accounts/by-riot-id/ReallyBlue/NA1?api_key=RGAPI-APIKEY')
    userid = data.json()['puuid']
    return render(response, "main/home.html", {
        'form': SearchUser(), # include reference to your form
        'userid': userid,
        # 'mmr': apidata['rank']
    })


def search(response):
    form = SearchUser()
    return render(response, "main/home.html", {"form": form})

CodePudding user response:

Your view function that renders the form and the form template must match. form also must be in your context.

Put the form in the home.html and change the home view like so:

def home(response):
    form = SearchUser()
    return render(response, "main/home.html", {'form': form})
  • Related