[PYTHON] Django-Tipps - Erstellen Sie eine Ranking-Site mit Django-

Einführung

Seit ich zum ersten Mal eine App mit Django erstellt habe, handelt es sich um ein Memorandum von Problemen und Lösungen, die ich damals hatte. Dieses Mal habe ich eine Rangliste für AtCoder erstellt. Es fiel mir schwer, einen Überblick über das MVC-Modell (MTV für Django?) Zu bekommen. Referenz (http://mimumimu.net/blog/2011/11/21/python-django-%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%E3%80 % 82-mtv-Modell-% E3% 81% AB% E3% 81% A4% E3% 81% 84% E3% 81% A6 /)

0. Entwickeln Sie ein Webanwendungskonzept

Welche Art von Service möchten Sie überhaupt erstellen? ->

1. Erstellen Sie eine App mit Django

$ django-admin startproject project-name
$ cd project-name
$ python manage.py startapp app-name

2. Laden Sie die Vorlage herunter

Das Schreiben von HTML, CSS und JavaScript war mühsam. Laden Sie daher die Vorlage Bootstrap herunter.

3. Bedienen Sie die Vorlage

Fügen Sie in Django HTML in den Ordner / project / app / templates und CSS und JavaScript in den Ordner / project / static / app ein.

HTML-Dateien verarbeiten:

-Base HTML-Datei- Schreiben Sie die Navigationsleiste und die zu lesende Datei als `{% static'project / app / file '%}`. <title>Im Inhalt{% block title %} {% endblock %}、 <body>Im Inhalt{% block body %} {% endblock %}schreiben.

-HTML-Datei zu erweitern- Der Inhalt der HTML-Datei `<title>` ist {% block title%} {% endblock%}, Schreiben Sie den Inhalt der HTML-Datei `<body>` in {% block body%} {% endblock%}.

4. Bearbeiten Sie model.py

Implementieren Sie das in 0 betrachtete Modell.

In diesem Fall können Sie sich anstelle des Standardbenutzers als Ihr eigener Benutzer anmelden. models.py (Teilauszug)

from django.contrib.auth.models import (BaseUserManager, AbstractBaseUser)

class UserManager(BaseUserManager):
    def create_user(self, username, email, password, **extra_fields):
        now = timezone.now()
        if not email:
            raise ValueError('Users must have an email address.')
        email = UserManager.normalize_email(email)
        user = self.model(
            username=username,
            email=email,
            is_active=True,
            last_login=now,
            date_joined=now,
            **extra_fields
        )
        user.set_password(password)
        user.save()
        return user

    def create_superuser(self, username, email, password, **extra_fields):
        user = self.create_user(username, email, password)
        user.is_active = True
        user.is_staff = True
        user.is_admin = True
        user.is_superuser = True
        user.save(using=self._db)
        return user


class User(AbstractBaseUser):
    username = models.CharField(_('username'), max_length=30, unique=True,)
    arc_user_name = models.CharField(_('arc name'), max_length=15, blank=True)
    email = models.EmailField(verbose_name='email address', max_length=255, unique=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_admin = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)
    delete = models.BooleanField(default=0)
    score = models.IntegerField(default=0)
    main_language = models.CharField(max_length=15, default='')
    objects = UserManager()

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']

    def email_user(self, subject, message, from_email=None):
        send_mail(subject, message, from_email, [self.email])

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return self.is_admin

    def get_short_name(self):
        "Returns the short name for the user."
        return self.arc_user_name

    def __str__(self):
        return self.username

5. Bearbeiten Sie views.py

from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import TemplateView, CreateView
from atcoder_ranking.commons.libraries import *
from .models import *


class IndexView(LoginRequiredMixin, TemplateView):
    template_name = 'index.html'

    def get(self, _, *args, **kwargs):
        users = User.objects.all()
        results = Result.objects.all().select_related('user')
        for user in users:
            user.score = len(results.filter(user=user)) * 100
            language_list = [result.result_language for result in results.filter(user=user)]
            if language_list != []:
                #Wählen Sie die zahlreichste Sprache als Hauptsprache
                user.main_language = Counter(language_list).most_common(1)[0][0]
            user.save()

        context = super(IndexView, self).get_context_data(**kwargs)
        context['users'] = User.objects.all().order_by('-score')[: 3]

        return render(self.request, self.template_name, context)

6. Bearbeiten Sie url.py.

Erstellen Sie für die erstellte views.py.

from django.conf.urls import url
from django.contrib import admin

import ranking.views as ranking_view

urlpatterns = [
    # admin
    url(r'^admin/?', admin.site.urls),

    # top page
    url(r'^$', ranking_view.TopView.as_view()),

    # ranking
    url(r'^ranking/?$', ranking_view.IndexView.as_view()),
    url(r'^ranking/result.png$', ranking_view.plotResults),
    url(r'^ranking/create/$', ranking_view.CreateUserView.as_view()),
    url(r'^ranking/problems/$', ranking_view.AtCoderProblemsView.as_view()),
    url(r'^ranking/get_problems/$', ranking_view.GetProblemsView.as_view()),
    url(r'^ranking/posts/$', ranking_view.PostsView.as_view()),
    url(r'^ranking/posts/(?P<posts_id>[0-9]+)/$', ranking_view.PostsDetailView.as_view()),
    url(r'^ranking/create_posts/$', ranking_view.CreatePostsView.as_view()),
    url(r'^ranking/login/$', ranking_view.LoginView.as_view(), name='login'),
    url(r'^ranking/logout/$', ranking_view.logout, name='logout')
]

7. Bearbeiten Sie test.py

Sie können es so schreiben, wie es ist, oder Sie können Selen verwenden. Ich habe einen Test durchgeführt, um ein Modellobjekt mit factory_boy zu erstellen.

factory.py

from atcoder_ranking.commons.libraries import *

from ranking.models import *


class UserFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = User
    username = factory.Sequence(lambda n: 'testing_user{}'.format(n))
    arc_user_name = factory.Faker('name')
    email = factory.Sequence(lambda n: 'testuser{}@gmail.com'.format(n))
    password = factory.PostGenerationMethodCall(
        'set_password', 'ranking_password')

test.py

class IndexViewTest(TestCase):
    @classmethod
    def setUpTestData(cls):
        cls.user = UserFactory.create()

    def setUp(self):
        self.client = ServiceTestTool.login(Client(), IndexViewTest.user, 'ranking_password')

    def test_index_ranking(self):
        # create 10 testusers
        users = [UserFactory.create() for i in range(10)]
        # create posts for testusers:
        result1 = [ResultFactory.create(user=users[1]) for i in range(30)]
        result2 = [ResultFactory.create(user=users[2]) for i in range(20)]
        result3 = [ResultFactory.create(user=users[3]) for i in range(40)]
        result4 = [ResultFactory.create(user=users[4]) for i in range(10)]
        result5 = [ResultFactory.create(user=users[5]) for i in range(5)]
        result6 = [ResultFactory.create(user=users[6]) for i in range(50)]

        response = self.client.get('/ranking/')

        self.assertContains(response, users[1].username)
        self.assertContains(response, users[3].username)
        self.assertContains(response, users[6].username)
        self.assertNotContains(response, users[2].username)
        self.assertNotContains(response, users[4].username)
        self.assertNotContains(response, users[5].username)
        self.assertNotContains(response, users[0].username)

8. Versuchen Sie, den Test auszuführen

$ python manage.py test

9. Verschieben Sie die Seite

$ python manage.py runserver
スクリーンショット 2017-07-01 14.44.58.png

Wenn es so angezeigt wird, ist es vollständig!

Recommended Posts

Django-Tipps - Erstellen Sie eine Ranking-Site mit Django-
Erstellen Sie eine Homepage mit Django
Stellen Sie die Django-Anwendung mit Docker bereit
Erstellen Sie eine Webanwendung mit Django
Machen Sie einen Filter mit einer Django-Vorlage
Erstellen Sie mit Django einen Datei-Uploader
Websites nützlich für das Studium von Django
Einfacher RSS-Reader mit Django
Lassen Sie uns mit Docker eine dynamische Site kratzen
Erstellen eines Anmeldebildschirms in Django all auth
Hinweise zum Aktivieren von PostgreSQL mit Django
Ich habe eine WEB-Bewerbung bei Django gemacht
Internationalisierung mit Django
CRUD mit Django
So entwickeln Sie eine Cart-App mit Django
Starten Sie Django in einer virtuellen Umgebung mit Pipenv
[Python] Erstellen Sie mit Docker eine Django-Entwicklungsumgebung
Erstellen Sie mit Vagrant in 5 Minuten eine Django-Umgebung
Erstellen Sie mit Django ein Dashboard für Netzwerkgeräte!
Eine Geschichte über die Implementierung eines Anmeldebildschirms mit Django
Erstellen Sie mit der Doker Toolbox eine Django-Entwicklungsumgebung
Erstellen Sie mit Django eine Hallo-Welt-Anwendung mit nur einer Datei
Einfache Aufgabenliste, erstellt mit Python + Django
Konfigurieren Sie ein Modul mit mehreren Dateien in Django
Erstellen Sie mit IntelliJ schnell eine Python Django-Umgebung
Greifen Sie mit Requests auf eine Site mit Clientzertifikatauthentifizierung zu
Versuchen Sie, mit WebSocket mit Django (Swamp Dragon) eine Todo-Verwaltungssite zu erstellen.
Authentifizieren Sie Google mit Django
Laden Sie Dateien mit Django hoch
Entwicklungsverdauung mit Django
Erstellen Sie einen Django-Zeitplan
Erstellen Sie eine Todo-App mit Django REST Framework + Angular
PDF mit Django ausgeben
Markdown-Ausgabe mit Django
Rückblick auf die Erstellung eines Webdienstes mit Django 1
A4 Größe mit Python-Pptx
Twitter OAuth mit Django
Lassen Sie uns eine Todo-App mit dem Django REST-Framework erstellen
Erste Schritte mit Django 1
Mail mit Django senden
Todo-App mit Django erstellen ③ Aufgabenlistenseite erstellen
Rückblick auf die Erstellung eines Webdienstes mit Django 2
Datei-Upload mit Django
Verwenden Sie WENIGER mit Django
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 2 ~
Pooling mechanisieren mit Django
Übergang zum Update-Bildschirm mit dem Django-Tag
Ein Memo zum Erstellen einer Django (Python) -Anwendung mit Docker
Stellen Sie die mit PTVS erstellte Django-App in Azure bereit
Starten Sie Django auf einem Docker-Container mit Docker-Compose Up
Verwenden Sie MySQL mit Django
Starten Sie ein Django-Projekt
Lebe ein Haml-Leben mit Django1.8 + Jinja2 + hamlish-jinja (Python3)
Mit Dekorateur dekorieren
Todo-App mit Django erstellen ⑤ Funktion zum Bearbeiten von Aufgaben erstellen
Erstellen Sie eine Entwicklungsumgebung mit Poetry Django Docker Pycharm
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 3 ~
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 4 ~
Django ab heute
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 5 ~