Bugün ne öğrendim? 31 Djangoya mini bir tekrar

Takip ettiğim kursun sonuna geldim neredeyse, bu yüzden son konuyu çok anlamadığımı da düşündüğüm için bir tekrar yapmak istiyorum izninizle, sevgili kod dostları(radyo programı hitabı gibi oldu :)) Bu mini konudan sonra harika bir entegrasyon konusu var gözüm onda 🙂

Haydi başlayalım.

Şimdi öncelikle daha yapılmış hazır bir uygulamayı çalıştıralım ve bakalım ne yapmamız gerekiyor?

Anasayfa
Register sayfası
Login(Giriş) sayfası

Şimdi bu sayfanın oluşması için nelere ihtiyacımızın olduğunu gözden geçirelim. Bir index.html gibi bir anasayfaya,bu tatlı form için form.py, veritabanına kayıt edebilmemiz için model.py ve html ile bir bağ kurabilmesi için bir view.py dosyasına ihtiyacımız var. Tabi ki urls.py’ı unutmamak lazım.

index.html

{% extends "basic_app/base.html" %}
{% block body_block %}

<div class="container"&gt;
  <div class="jumbotron"&gt;
    <h1&gt;Django Level Five</h1&gt;
    {% if user.is_authenticated %}
        <h2&gt;Welcome {{ user.username }}!</h2&gt;
    {% else %}
        <h2&gt;Welcome to the site!</h2&gt;
    {% endif %}
  </div&gt;
</div&gt;

{% endblock %}

Tabi bunun için bir base.html‘e de ihtiyacımız lazım

<!DOCTYPE html&gt;
<html&gt;
  <head&gt;
    <meta charset="utf-8"&gt;
    <title&gt;Base</title&gt;
    <!-- Latest compiled and minified CSS --&gt;
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"
    integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous"&gt;

  </head&gt;
  <body&gt;
    <nav class="navbar navbar-expand-lg navbar-light bg-light"&gt;
      <div class="navbar-nav"&gt;
        {# Django Home Link / Admin Link / Register Link#}
        <a class="navbar-brand" href="{% url 'index' %}"&gt;DJANGO</a&gt;
        <a class="nav-item nav-link" href="{% url 'admin:index' %}"&gt;Admin</a&gt;
        <a class="nav-item nav-link" href="{% url 'basic_app:register' %}"&gt;Register</a&gt;

        {# Some logic on what to display for last item#}
        {% if user.is_authenticated %}
          <a class="nav-link" href="{% url 'logout' %}"&gt;Logout</a&gt;
        {% else %}
          <a class="nav-link" href="{% url 'basic_app:user_login' %}"&gt;Login</a&gt;
        {% endif %}
      </div&gt;
    </nav&gt;

    <div class="container"&gt;
    {% block body_block %}
    {% endblock %}
    </div&gt;


  </body&gt;
</html&gt;

View.py

from django.shortcuts import render
from .forms import UserForm,UserProfileInfoForm

# Extra Imports for the Login and Logout Capabilities
from django.contrib.auth import authenticate, login, logout
from django.http import HttpResponseRedirect, HttpResponse
from django.urls import reverse
from django.contrib.auth.decorators import login_required

# Create your views here.
def index(request):
    return render(request,'basic_app/index.html')

@login_required
def special(request):
    # Remember to also set login url in settings.py!
    # LOGIN_URL = '/basic_app/user_login/'
    return HttpResponse("You are logged in. Nice!")

@login_required
def user_logout(request):
    # Log out the user.
    logout(request)
    # Return to homepage.
    return HttpResponseRedirect(reverse('index'))

def register(request):

    registered = False

    if request.method == 'POST':

        # Get info from "both" forms
        # It appears as one form to the user on the .html page
        user_form = UserForm(data=request.POST)
        profile_form = UserProfileInfoForm(data=request.POST)

        # Check to see both forms are valid
        if user_form.is_valid() and profile_form.is_valid():

            # Save User Form to Database
            user = user_form.save()

            # Hash the password
            user.set_password(user.password)

            # Update with Hashed password
            user.save()

            # Now we deal with the extra info!

            # Can't commit yet because we still need to manipulate
            profile = profile_form.save(commit=False)

            # Set One to One relationship between
            # UserForm and UserProfileInfoForm
            profile.user = user

            # Check if they provided a profile picture
            if 'profile_pic' in request.FILES:
                print('found it')
                # If yes, then grab it from the POST form reply
                profile.profile_pic = request.FILES['profile_pic']

            # Now save model
            profile.save()

            # Registration Successful!
            registered = True

        else:
            # One of the forms was invalid if this else gets called.
            print(user_form.errors,profile_form.errors)

    else:
        # Was not an HTTP post so we just render the forms as blank.
        user_form = UserForm()
        profile_form = UserProfileInfoForm()

    # This is the render and context dictionary to feed
    # back to the registration.html file page.
    return render(request,'basic_app/registration.html',
                          {'user_form':user_form,
                           'profile_form':profile_form,
                           'registered':registered})

def user_login(request):

    if request.method == 'POST':
        # First get the username and password supplied
        username = request.POST.get('username')
        password = request.POST.get('password')

        # Django's built-in authentication function:
        user = authenticate(username=username, password=password)

        # If we have a user
        if user:
            #Check it the account is active
            if user.is_active:
                # Log the user in.
                login(request,user)
                # Send the user back to some page.
                # In this case their homepage.
                return HttpResponseRedirect(reverse('index'))
            else:
                # If account is not active:
                return HttpResponse("Your account is not active.")
        else:
            print("Someone tried to login and failed.")
            print("They used username: {} and password: {}".format(username,password))
            return HttpResponse("Invalid login details supplied.")

    else:
        #Nothing has been provided for username or password.
        return render(request, 'basic_app/login.html', {})

Forms.py

from django import forms
from django.contrib.auth.models import User
from .models import UserProfileInfo

class UserForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput())

    class Meta():
        model = User
        fields = ('username','email','password')


class UserProfileInfoForm(forms.ModelForm):
    class Meta():
        model = UserProfileInfo
        fields = ('portfolio_site','profile_pic')

models.py

from django.db import models
from django.contrib.auth.models import User

class UserProfileInfo(models.Model):

    # Create relationship (don't inherit from User!)
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    # Add any additional attributes you want
    portfolio_site = models.URLField(blank=True)
    # pip install pillow to use this!
    # Optional: pip install pillow --global-option="build_ext" --global-option="--disable-jpeg"
    profile_pic = models.ImageField(upload_to='basic_app/profile_pics',blank=True)

    def __str__(self):
        # Built-in attribute of django.contrib.auth.models.User !
        return self.user.username

urls.py

from django.urls import path
from . import views

# SET THE NAMESPACE!
app_name = 'basic_app'

# Be careful setting the name to just /login use userlogin instead!
urlpatterns=[
    path('register/',views.register,name='register'),
    path('user_login/',views.user_login,name='user_login'),
]

tabi bu projeyi tamamlarken, sanal makinede olmaya ve daha önce ki yazımda belirttiğim paketler olan, pilow ,django[argon2] ve bcrypt

Bu harika projemizi çalıştırmaya başlamadan önce migrate etmeyi unutmayın.

Bugünlük anlatacaklarım bu kadar ciddi ciddi anlamadığım konuyu bu yazı sayesinde anladım. Projeyi tamamlayıp git’e atacağım. Görüşmek üzere!

Reklamlar

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s