[PYTHON] Django Tips-Créez un site de classement avec Django-

introduction

Depuis que j'ai créé une application avec Django pour la première fois, c'est un mémorandum de problèmes et de solutions que j'avais à l'époque. Cette fois, j'ai créé un site de classement pour AtCoder. J'ai eu du mal à avoir une vue d'ensemble du modèle MVC (MTV pour Django?). Référence (http://mimumimu.net/blog/2011/11/21/python-django-%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%E3%80 % Modèle 82-mtv-% E3% 81% AB% E3% 81% A4% E3% 81% 84% E3% 81% A6 /)

0. Développer un concept d'application Web

Quel type de service souhaitez-vous créer en premier lieu? ->

1. Créez une application avec Django

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

2. Télécharger le modèle

Écrire du HTML, du CSS et du JavaScript était un problème, alors téléchargez le modèle Bootstrap.

3. Utilisez le modèle

Dans Django, placez HTML dans le dossier / project / app / templates et CSS et JavaScript dans le dossier / project / static / app.

Traitement des fichiers HTML:

-Fichier HTML de base- Écrivez la barre de navigation et le fichier à lire comme {% static'project / app / file '%} ``. <title>Dans le contenu{% block title %} {% endblock %}、 <body>Dans le contenu{% block body %} {% endblock %}écrire.

-Fichier HTML à étendre- Le contenu du fichier HTML '' <code>est {% block title%} {% endblock%}, Écrivez le contenu du fichier HTML</code> <body> <code> </code> dans {% block body%} {% endblock%}.</p> <h2>4. Modifiez model.py</h2> <p>Implémentez le modèle considéré en 0.</p> <p>Dans ce cas, le fait est que vous pouvez vous connecter en tant que votre propre utilisateur au lieu de l'utilisateur par défaut. models.py (extrait partiel)</p> <pre><code>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 </code></pre> <h2>5. Modifiez views.py</h2> <ul> <li>Rédigé en utilisant une vue à usage général basée sur les classes. --CreateView pour l'enregistrement des utilisateurs et la publication des résultats, TemplateView pour les autres.</li> <li>En utilisant LoginRequiredMixin, seuls les utilisateurs connectés peuvent le voir.</li> <li>Si vous gérez collectivement des bibliothèques externes avec atcoder_ranking.commons.libraries, le code sera propre.</li> </ul> <pre><code>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 != []: #Sélectionnez la langue la plus nombreuse comme langue principale 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) </code></pre> <h2>6. Modifiez url.py</h2> <p>Créez pour le views.py créé.</p> <pre><code>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') ] </code></pre> <h2>7. Modifiez test.py</h2> <p>Vous pouvez l'écrire tel quel ou utiliser Selenium. J'ai fait un test pour créer un objet Model en utilisant factory_boy.</p> <p>factory.py</p> <pre><code>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') </code></pre> <p>test.py</p> <pre><code>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) </code></pre> <h2>8. Essayez d'exécuter le test</h2> <pre><code>$ python manage.py test </code></pre> <h2>9. Déplacer la page</h2> <pre><code>$ python manage.py runserver </code></pre> <img width="1356" alt="スクリーンショット 2017-07-01 14.44.58.png " src="https://qiita-image-store.s3.amazonaws.com/0/177049/a8bbd436-6dee-dca6-ac96-7f11b15bf251.png "> <p>S'il est affiché comme ça, c'est terminé!</p> <!-- ENDDDDDDDDDDDDDDDDDDDDDDDDDDDDD --> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <!-- post_new_ui_horiz --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-5469278205356604" data-ad-slot="4209814965" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> <div style="margin-top: 30px;"> <div class="link-top" style="margin-top: 1px;"></div> <p> <font size="4">Recommended Posts</font> <!-- BEGIN LINK ************************* --> <div style="margin-top: 10px;"> <a href="/fr/70dca57bc70a99b1c3b7">Django Tips-Créez un site de classement avec Django-</a> </div> <div style="margin-top: 10px;"> <a href="/fr/57a1e09f966bcb82f12a">Créer une page d'accueil avec django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/54f49f359259f2efd130">Déployer l'application Django avec Docker</a> </div> <div style="margin-top: 10px;"> <a href="/fr/9cd0ca5cda7f459533c3">Créer une application Web avec Django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/af54a08dd6b4c719ce1f">Créer un filtre avec un modèle django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/f7b1b0b7f2099e403947">Créer un téléchargeur de fichiers avec Django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/0ccc6bdcd984f7cc2d0e">Sites utiles pour étudier Django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/165c5fd67b759de536a7">Lecteur RSS simple réalisé avec Django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/6cc970b3aa8f94ce2909">Raclons un site dynamique avec Docker</a> </div> <div style="margin-top: 10px;"> <a href="/fr/8421cf45bfaee9e6e238">Créer un écran de connexion dans Django all auth</a> </div> <div style="margin-top: 10px;"> <a href="/fr/b5b7c497fc40c0ef5811">Remarques sur l'activation de PostgreSQL avec Django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/fa7a6235d40eaea8bc33">J'ai fait une application WEB avec Django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/4f59f154b7a4b111fe0d">Internationalisation avec Django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/ab7f0eeeaec0e60d6b92">CRUD avec Django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/469c6afe6e132822bd03">Comment développer une application de panier avec Django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/487a635d226fb0705b13">Démarrez Django dans un environnement virtuel à l'aide de Pipenv</a> </div> <div style="margin-top: 10px;"> <a href="/fr/60bc24dba80688d5d03a">[Python] Créer un environnement de développement Django avec Docker</a> </div> <div style="margin-top: 10px;"> <a href="/fr/6fd9991c6fcba00c4c71">Créez un environnement Django avec Vagrant en 5 minutes</a> </div> <div style="margin-top: 10px;"> <a href="/fr/784c261c58f29785ac56">Créez un tableau de bord pour les appareils réseau avec Django!</a> </div> <div style="margin-top: 10px;"> <a href="/fr/8e438460e1397224d844">Une histoire sur l'implémentation d'un écran de connexion avec django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/943093d15db9a55e7b4c">Créer un environnement de développement Django à l'aide de Doker Toolbox</a> </div> <div style="margin-top: 10px;"> <a href="/fr/b6385fde9e32bbb8d57b">Créez une application Hello World avec un seul fichier avec django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/b9a5fae4dc71fc2bc449">Liste de tâches simple créée avec Python + Django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/c4ca5bd070e823403fdf">Configurer un module avec plusieurs fichiers dans Django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/cd0197c9f56521d08ca2">Créez rapidement un environnement Python Django avec IntelliJ</a> </div> <div style="margin-top: 10px;"> <a href="/fr/ec51120605f82fbd06fd">Accéder à un site avec l'authentification par certificat client avec les demandes</a> </div> <div style="margin-top: 10px;"> <a href="/fr/974539674e49426e7913">Essayez de créer un site de gestion Todo en utilisant WebSocket avec Django (Swamp Dragon)</a> </div> <div style="margin-top: 10px;"> <a href="/fr/005109fa4d9ad9736eb1">Authentifier Google avec Django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/06c52ecfd3c40cbbe522">Télécharger des fichiers avec Django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/0e15f6c150caa13ca34c">Résumé du développement avec Django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/0fa0a13c6097d8eb6046">Créer un planning Django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/14d81209ac195e485338">Créer une application Todo avec Django REST Framework + Angular</a> </div> <div style="margin-top: 10px;"> <a href="/fr/201d278ee52e81cf4eee">Sortie PDF avec Django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/271b38ef2c6610f40929">Sortie Markdown avec Django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/3863acb11a0947ce91bb">Retour sur la création d'un service Web avec Django 1</a> </div> <div style="margin-top: 10px;"> <a href="/fr/38a946b624b483562a4d">Format A4 avec python-pptx</a> </div> <div style="margin-top: 10px;"> <a href="/fr/4c9edec8fbefb3116bf6">Twitter OAuth avec Django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/5be98eeae72dca2260bc">Essayez de créer une application Todo avec le framework Django REST</a> </div> <div style="margin-top: 10px;"> <a href="/fr/6e044550435796ef09c5">Premiers pas avec Django 1</a> </div> <div style="margin-top: 10px;"> <a href="/fr/82454eaedbf94273c4f1">Envoyer des e-mails avec Django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/828283aad5e5e2d8573d">Créer une application Todo avec Django ③ Créer une page de liste de tâches</a> </div> <div style="margin-top: 10px;"> <a href="/fr/86b630348309720edb51">Retour sur la création d'un service Web avec Django 2</a> </div> <div style="margin-top: 10px;"> <a href="/fr/8f94095a1e58e2d5cb21">Téléchargement de fichiers avec django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/abaf2a920ce60339a87f">Utilisez LESS avec Django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/af168aa59cb0d8426100">[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 2 ~</a> </div> <div style="margin-top: 10px;"> <a href="/fr/b98ee1d1aa59fc12866e">La mutualisation mécanise avec Django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/bccd74b1bb35f6436c33">Transition vers l'écran de mise à jour avec le Django a tag</a> </div> <div style="margin-top: 10px;"> <a href="/fr/bcef239908e8ba7ed8ad">Un mémo sur la création d'une application Django (Python) avec Docker</a> </div> <div style="margin-top: 10px;"> <a href="/fr/bf3f50e46482124a4f36">Déployer l'application Django créée avec PTVS sur Azure</a> </div> <div style="margin-top: 10px;"> <a href="/fr/c0f525190b39395d4170">Lancer Django sur un conteneur Docker à l'aide de docker-compose up</a> </div> <div style="margin-top: 10px;"> <a href="/fr/c9dbc320a0e0e84093da">Utiliser MySQL avec Django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/d0f3c319725c4f480de5">Démarrer un projet Django</a> </div> <div style="margin-top: 10px;"> <a href="/fr/db601b5193bda735a41a">Vivez une vie de Haml avec Django1.8 + Jinja2 + hamlish-jinja (Python3)</a> </div> <div style="margin-top: 10px;"> <a href="/fr/dc0d217d58d9b5e4936d">Décorer avec un décorateur</a> </div> <div style="margin-top: 10px;"> <a href="/fr/dc4b91784cf895cc71c3">Créer une application Todo avec Django ⑤ Créer une fonction d'édition de tâches</a> </div> <div style="margin-top: 10px;"> <a href="/fr/dde20a965e212ab449b2">Créez un environnement de développement avec Poetry Django Docker Pycharm</a> </div> <div style="margin-top: 10px;"> <a href="/fr/ecd06c48dea0941e261d">[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 3 ~</a> </div> <div style="margin-top: 10px;"> <a href="/fr/ed613547bc17ca709518">[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 4 ~</a> </div> <div style="margin-top: 10px;"> <a href="/fr/edb561ceae1c4abdd16a">Django à partir d'aujourd'hui</a> </div> <div style="margin-top: 10px;"> <a href="/fr/f3747d157a8ca28e9cc4">[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 5 ~</a> </div> <!-- END LINK ************************* --> </p> </div> </div> </div> <div class="footer text-center" style="margin-top: 40px;"> <!-- <p> Licensed under cc by-sa 3.0 with attribution required. </p> --> </div> <script src="https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/js/bootstrap.min.js"></script> <script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@10.1.2/build/highlight.min.js"></script> <script> $(document).ready(function() { var cfg_post_height = 60; var cfg_per = 0.51; var ads_obj = $('<ins class="adsbygoogle" style="display:block; text-align:center;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-5469278205356604" data-ad-slot="7950405964"></ins>'); $('pre code').each(function(i, e) {hljs.highlightBlock(e)}); function getDocumentOffsetPosition( el ) { var _x = 0; var _y = 0; while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) { _x += el.offsetLeft - el.scrollLeft; _y += el.offsetTop - el.scrollTop; el = el.offsetParent; } return { top: _y, left: _x }; } if ( $( "#article202011" ).length ) { var h1_pos = getDocumentOffsetPosition($('h1')[0]); var footer_pos = getDocumentOffsetPosition($('.link-top')[0]); var post_distance = footer_pos.top - h1_pos.top; // console.log('h1_pos: '+ h1_pos.top); // console.log(cfg_post_height) if((post_distance/h1_pos.top)>=cfg_post_height) { // console.log('tesssssssssssssssssssssssssssssssss'); $( ".container p" ).each(function( index ) { var p_tag_pos = $(this).position().top; var dis = p_tag_pos - h1_pos.top; var per = dis/post_distance; if(per>cfg_per) { ads_obj.insertAfter($(this)); (adsbygoogle = window.adsbygoogle || []).push({}); console.log( index + ": " + $( this ).text() ); return false; } }); } } }); </script> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> <!-- ads --> <script data-ad-client="ca-pub-5469278205356604" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" type="d7540fe192d881abe59fcf57-text/javascript"></script> <!-- end ads --> </body> </html><script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="3bc6407ff1afcf779932682f-|49" defer></script>