Π’ΡΠ΅ΡΠΈΠΉ ΡΡΠ°ΠΏ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ
ΠΠ° ΡΡΠΎΠΌ ΡΡΠ°ΠΏΠ΅ ΠΌΡ Π·Π°ΠΉΠΌΠ΅ΠΌΡΡ ΠΏΡΠΎΡΠΈΠ»ΡΠΌΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠΌ Π°Π²ΡΠΎΡΠ°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ, ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈ ΡΠ΄Π°Π»ΡΡΡ ΡΠ²ΠΎΠΈ Π·Π°ΠΏΠΈΡΠΈ ΡΠΎ ΡΡΠΎΡΠΎΠ½Ρ ΡΡΠΎΠ½ΡΠ΅Π½Π΄Π°. ΠΠΎΠ΄ Π΄Π»Ρ Π²ΡΠ΅Ρ ΡΠ°ΠΉΠ»ΠΎΠ² ΡΡΠΎΠΉ ΡΠ°ΡΡΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π·Π΄Π΅ΡΡ.
Π‘ΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΠΏΡΠΎΡΠΈΠ»Π΅ΠΉ
ΠΠ° ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΡΡΠ°ΠΏΠ΅ ΠΌΡ ΡΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π»ΠΈ ΠΌΠΎΠ΄Π΅Π»Ρ Π΄Π»Ρ ΠΏΡΠΎΡΠΈΠ»Ρ ΠΈ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π»ΠΈ Π΅Π΅. Π’Π΅ΠΏΠ΅ΡΡ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π°Π²Π°ΡΠ°ΡΠΎΠΊ Π² Π½ΡΠΆΠ½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΠΆΠ°Π½Π³ΠΎ ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΏΠ°ΠΏΠΊΡ profile_pics (Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π°Π²Π°ΡΠ°ΡΠΎΠΊ) Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅ Ρ ΠΏΠ°ΠΏΠΊΠ°ΠΌΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΡΡΠΎ Π½Π΅ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΠ΄ΠΎΠ±Π½ΠΎ.
Π§ΡΠΎΠ±Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΠΏΠΊΠΈ, ΠΎΡΠΊΡΠΎΠΉΡΠ΅ my_site\settings.py ΠΈ Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ Π² Π½Π°ΡΠ°Π»ΠΎ ΡΠ°ΠΉΠ»Π° import os
, Π° Π² ΠΊΠΎΠ½Π΅Ρ Π²ΡΡΠ°Π²ΡΡΠ΅:
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ ΡΠ΅ΡΠ²Π΅Ρ, Π²ΠΎΠΉΠ΄ΠΈΡΠ΅ Π² ΠΏΠ°Π½Π΅Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ β ΡΠ°ΠΌ ΡΠΆΠ΅ Π΅ΡΡΡ ΡΠ°Π·Π΄Π΅Π» Profiles, ΠΏΡΠΈΡΠ΅ΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΎΡΠΈΠ»Π΅ΠΉ ΡΠ°Π²Π½ΠΎ 0, Ρ ΠΎΡΡ ΠΌΡ ΡΠΎΠ·Π΄Π°Π»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ. Π§ΡΡΡ ΠΏΠΎΠ·ΠΆΠ΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΏΡΠΎΡΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠ΅ΠΉ Π°ΠΊΠΊΠ°ΡΠ½ΡΠΎΠ², Π° ΠΏΠΎΠΊΠ° ΡΡΠΎ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π²ΡΡΡΠ½ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΡΠΈΠ»Ρ Π΄Π»Ρ Π°Π΄ΠΌΠΈΠ½Π° Ρ Π°Π²Π°ΡΠ°ΡΠΊΠΎΠΉ, ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΡΠΈΠ»Ρ Π΄Π»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π±Π΅Π· Π°Π²Π°ΡΠ°ΡΠΊΠΈ β Π²Π΅ΡΠ½Π΅Π΅, Ρ Π½Π΅Π³ΠΎ Π±ΡΠ΄Π΅Ρ Π°Π²Π°ΡΠ°ΡΠΊΠ° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ default.jpg, ΠΊΠΎΡΠΎΡΡΡ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ Π² ΠΏΠ°ΠΏΠΊΡ media (Π½ΠΎ Π½Π΅ Π²Π½ΡΡΡΡ profile_pics, Π° ΡΡΠ΄ΠΎΠΌ).
ΠΠ½Π΅ΡΠΈΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΡΠ°Π±Π»ΠΎΠ½ ΠΏΡΠΎΡΠΈΠ»Ρ users\profile.html:
{% extends "blog/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<div class="content-section">
<div class="media">
<img class="rounded-circle account-img" src="{{ user.profile.image.url }}">
<div class="media-body">
<h2 class="account-heading">{{ user.username }}</h2>
<p class="text-secondary">{{ user.email }}</p>
</div>
</div>
<!-- ΠΠ΄Π΅ΡΡ Π±ΡΠ΄Π΅Ρ ΡΠΎΡΠΌΠ° -->
</div>
{% endblock content %}
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΡΠΎΡΠΈΠ»Ρ Π°Π΄ΠΌΠΈΠ½Π° Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:

ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΠΎΡΠΈΠ»Π΅ΠΉ
ΠΡΡΠ°Π»ΠΎΡΡ ΡΠ΅ΡΠΈΡΡ Π·Π°Π΄Π°ΡΡ Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΡΠΈΠ»Π΅ΠΉ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ. Π ΠΠΆΠ°Π½Π³ΠΎ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°ΠΊΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ ΡΠΈΠ³Π½Π°Π»Ρ. Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ°ΠΉΠ» users\signals.py ΠΈ ΡΠΎΡ ΡΠ°Π½ΠΈΡΠ΅ Π² Π½Π΅ΠΌ ΡΡΠΎΡ ΠΊΠΎΠ΄. ΠΡΠΈ ΡΠΈΠ³Π½Π°Π»Ρ Π½ΡΠΆΠ½ΠΎ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ Π² users\apps.py.
ΠΡΠΎΠ²Π΅ΡΠΈΠΌ, ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΠΎΡΠΈΠ»Π΅ΠΉ β Π·Π°ΠΏΡΡΡΠΈΠΌ ΡΠ΅ΡΠ²Π΅Ρ ΠΈ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²ΡΠΉ Π°ΠΊΠΊΠ°ΡΠ½Ρ. ΠΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ:

ΠΠ°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠΈΠ»Π΅ΠΉ
ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ Π½ΡΠΆΠ½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ Π²Π½ΠΎΡΠΈΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΏΡΠΎΡΠΈΠ»Ρ β ΠΌΠ΅Π½ΡΡΡ ΡΠΎΡΠΎ, Π½ΠΈΠΊ ΠΈ Π΅ΠΌΠ΅ΠΉΠ», Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π²Π½Π΅ΡΠ΅ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π² ΡΠ°ΠΉΠ» users\forms.py β Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΈΠΌΠΏΠΎΡΡ from .models import Profile
Π² Π½Π°ΡΠ°Π»ΠΎ ΠΈ ΡΡΠΎΡ ΠΊΠΎΠ΄ Π² ΠΊΠΎΠ½Π΅Ρ:
class UserUpdateForm(forms.ModelForm):
email = forms.EmailField()
class Meta:
model = User
fields = ['username', 'email']
class ProfileUpdateForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['image']
ΠΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ ΠΊ users\views.py β ΡΠ΅ΠΏΠ΅ΡΡ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ°ΠΊ. Π ΡΠ°Π±Π»ΠΎΠ½ profile.html ΡΠΎΠΆΠ΅ Π½ΡΠΆΠ½ΠΎ Π²Π½Π΅ΡΡΠΈ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ β Π²ΡΡΠ°Π²ΡΡΠ΅ ΡΡΠΎΡ ΠΊΠΎΠ΄ Π²ΠΌΠ΅ΡΡΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡ "Π·Π΄Π΅ΡΡ Π±ΡΠ΄Π΅Ρ ΡΠΎΡΠΌΠ°":
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">ΠΠ°Ρ ΠΏΡΠΎΡΠΈΠ»Ρ</legend>
{{ u_form|crispy }}
{{ p_form|crispy }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info" type="submit">ΠΠ±Π½ΠΎΠ²ΠΈΡΡ</button>
</div>
</form>
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ ΠΌΠΎΠ³ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π² ΡΠ²ΠΎΠΈΡ ΠΏΡΠΎΡΠΈΠ»ΡΡ :

ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠΆΠ°ΡΠΈΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ
ΠΡΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ Π±ΡΠ΄ΡΡ Π·Π°Π³ΡΡΠΆΠ°ΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π±ΠΎΠ»ΡΡΠΈΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΡΠ΅ΡΠ²Π΅Ρ ΡΠΊΠΎΡΠΎ ΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π³ΡΡΠΆΠ΅Π½Π½ΡΠΌ. ΠΠΎΡΡΠΎΠΌΡ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ» ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠΆΠ°ΡΠΈΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°Π²Π°ΡΠ°ΡΠΎΠΊ. Π’Π°ΠΊΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Pillow, ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ ΡΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ. ΠΠ»Ρ ΡΠΆΠ°ΡΠΈΡ ΡΠΎΡΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Pillow Π² users\models.py Π½ΡΠΆΠ½ΠΎ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΡΡΠΎΡ ΠΊΠΎΠ΄. Π’Π΅ΠΏΠ΅ΡΡ ΠΊΡΡΠΏΠ½ΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠΌΠ΅Π½ΡΡΠ°ΡΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ.
ΠΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π°Π²Π°ΡΠ°ΡΠΎΠΊ Π² ΠΏΠΎΡΡΠ°Ρ
ΠΠΎΠΊΠ° ΡΡΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π²ΠΈΠ΄Π½Ρ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΈΡ ΠΏΡΠΎΡΠΈΠ»ΡΡ . Π§ΡΠΎΠ±Ρ ΡΠΎΡΠΎ Π°Π²ΡΠΎΡΠΎΠ² ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π»ΠΈΡΡ Π² ΠΏΠΎΡΡΠ°Ρ Π±Π»ΠΎΠ³Π°, Π²Π½Π΅ΡΠ΅ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π² ΡΠ°Π±Π»ΠΎΠ½ blog\home.html β ΡΠΎΡ ΡΠ°Π½ΠΈΡΠ΅ Π² Π½Π΅ΠΌ ΡΡΠΎΡ ΠΊΠΎΠ΄. ΠΠ²Π°ΡΠ°ΡΠΊΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π² ΠΏΠΎΡΡΠ΅:

CRUD
Π§ΡΠΎΠ±Ρ Π΄Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΏΠΎΡΡΠ°ΠΌΠΈ, Π½ΡΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ CRUD β Π½Π°Π±ΠΎΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΠΏΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ, ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°. Π‘ΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡΠ΅, Π΅ΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ ΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΊ ΠΊΠ»Π°ΡΡΠ°ΠΌ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½ΡΠ½Π΅ΡΠ½Π΅Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ°ΠΉΠ»Π° blog\views.py Π½ΡΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π½Π° ΡΡΠΎ, Π° ΠΊΠΎΠ΄ blog\urls.py Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ°ΠΊ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΊΠ»Π°ΡΡΡ PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView)
ΠΈ PostDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView)
β ΠΎΠ½ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅, ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΡΠΎΠ»ΡΠΊΠΎ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌΠΈ; ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈ ΡΠ΄Π°Π»ΡΡΡ ΠΏΠΎΡΡΡ ΠΌΠΎΠ³ΡΡ Π»ΠΈΡΡ ΠΈΡ
Π°Π²ΡΠΎΡΡ.
ΠΠ»Ρ ΠΏΡΠΎΡΠΌΠΎΡΡΠ° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΠΏΠΎΡΡΠΎΠ² ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠ°Π±Π»ΠΎΠ½ post_detail.html Π²ΠΎΡ Ρ ΡΠ°ΠΊΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ. Π’Π΅ΠΏΠ΅ΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠΊΡΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ: http://localhost:8000/post/1/. ΠΠΎΠ±Π°Π²ΠΈΠΌ ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π² ΡΠ°Π±Π»ΠΎΠ½ home.html:
<h2><a class="article-title" href="{% url 'post-detail' post.id %}">{{ post.title }}</a></h2>
ΠΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΡΠ°Π±Π»ΠΎΠ½Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΡΡ ΠΏΠΎΡΡΠΎΠ². Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ°ΠΉΠ» post_form.html Ρ ΡΠ°ΠΊΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ. Π€ΠΎΡΠΌΠ° Π±ΡΠ΄Π΅Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ http://localhost:8000/post/new/:

ΠΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π·Π°ΠΏΠΈΡΠΈ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²ΠΈΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ ΠΏΠΎΡΡΠ°. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄ blog\models.py Π½Π° ΡΡΠΎΡ, ΠΈ Π²ΡΠ΅ Π·Π°ΡΠ°Π±ΠΎΡΠ°Π΅Ρ:

ΠΠ°ΠΏΠΈΡΠΈ ΡΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡ, Π½ΠΎ ΠΏΠΎΠΊΠ° ΡΡΠΎ Π½Π΅Π»ΡΠ·Ρ ΡΠ΄Π°Π»ΡΡΡ. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½ΡΠΆΠ½ΡΠΉ ΡΠ°Π±Π»ΠΎΠ½ β ΡΠ°ΠΉΠ» blog\post_confirm_delete.html. ΠΠΎΠ΄ Π΄Π»Ρ Π½Π΅Π³ΠΎ Π΅ΡΡΡ Π·Π΄Π΅ΡΡ. Π’Π΅ΠΏΠ΅ΡΡ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΠΏΠΎΡΠ»Π΅ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ Π·Π°ΠΏΠΈΡΡ ΠΈΡΡΠ΅Π·Π°Π΅Ρ, Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π½Π° Π³Π»Π°Π²Π½ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ Π±Π»ΠΎΠ³Π°:

ΠΡΡΠ°Π»ΠΎΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΡΡΠ»ΠΊΡ Π½Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ Π½Π° ΠΏΠ°Π½Π΅Π»Ρ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΠΈ β ΠΌΡ ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΡΡΠΎ Π² ΡΠ°Π±Π»ΠΎΠ½Π΅ base.html, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π²ΡΠ΅Π³ΠΎ ΠΎΠ΄Π½Ρ ΡΡΡΠΎΠΊΡ <a class="nav-item nav-link" href="{% url 'post-create' %}">ΠΠΎΠ²Π°Ρ Π·Π°ΠΏΠΈΡΡ</a>
. ΠΡΠ΅ Π³ΠΎΡΠΎΠ²ΠΎ! ΠΡΠ»ΠΈ ΡΡΠΎ-ΡΠΎ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΡΠ²Π΅ΡΡΡΠ΅ΡΡ Ρ Π³ΠΎΡΠΎΠ²ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ ΠΊ ΡΡΠ΅ΡΡΠ΅ΠΌΡ ΡΡΠ°ΠΏΡ.
Π§Π΅ΡΠ²Π΅ΡΡΡΠΉ ΡΡΠ°ΠΏ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ
ΠΠ° Π·Π°ΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΌ ΡΡΠ°ΠΏΠ΅ ΡΠ°Π±ΠΎΡΡ Π½Π°Π΄ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠΌ ΠΌΡ Π·Π°Π³ΡΡΠ·ΠΈΠΌ ΠΊΠΎΠ½ΡΠ΅Π½Ρ ΠΈΠ· json ΡΠ°ΠΉΠ»Π° (Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΠΉ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ Django), ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΠΏΠ°Π³ΠΈΠ½Π°ΡΠΈΡ ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠΌ Π²ΡΠ²ΠΎΠ΄ Π²ΡΠ΅Ρ ΠΏΠΎΡΡΠΎΠ² Π°Π²ΡΠΎΡΠ° Π½Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΠ΅.
ΠΠΌΠΏΠΎΡΡ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ° ΠΈΠ· ΡΠ°ΠΉΠ»Π° json
Π‘ΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΏΠΎΡΡΡ ΠΎΡ ΠΈΠΌΠ΅Π½ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
Π°Π²ΡΠΎΡΠΎΠ² ΡΡΠΎΠΌΠΈΡΠ΅Π»ΡΠ½ΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π·Π°Π³ΡΡΠ·ΠΊΠΎΠΉ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ° ΠΈΠ· Π³ΠΎΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° posts.json. ΠΠ°ΠΏΡΡΡΠΈΠΌ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΡ ΠΊΠΎΠ½ΡΠΎΠ»Ρ ΠΠΆΠ°Π½Π³ΠΎ python manage.py shell
ΠΈ ΠΏΡΠΎΠ²Π΅Π΄Π΅ΠΌ ΠΈΠΌΠΏΠΎΡΡ. ΠΡΡΡΡΠΏΡ Π² ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ β 2 Π²ΠΌΠ΅ΡΡΠΎ ΠΎΠ±ΡΡΠ½ΡΡ
4:
>>> import json
>>> from blog.models import Post
>>> with open('posts.json', encoding="utf8") as f:
... posts_json = json.load(f)
...
>>> for post in posts_json:
... post = Post(title=post['title']), content=post['content'], author_id=post['user_id']
... post.save()
...
>>> exit()
Π’Π΅ΠΏΠ΅ΡΡ Π½Π° Π½Π°ΡΠ΅ΠΉ Π³Π»Π°Π²Π½ΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΏΠΈΡΠ΅ΠΉ.
ΠΠ°Π³ΠΈΠ½Π°ΡΠΈΡ
ΠΠΎΡΠ° ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΏΠ°Π³ΠΈΠ½Π°ΡΠΈΡ β ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡΡΠΎΠ² Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ. ΠΠ»Ρ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΠΎΡΡΠΎΠ² Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ Π²Π½Π΅ΡΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΊΠ»Π°ΡΡ PostListView(ListView)
Π² ΡΠ°ΠΉΠ»Π΅ blog\views.py β Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΡΡΠΎΠΊΡ paginate_by = 5. ΠΡΡΠ΅Π΄Π°ΠΊΡΠΈΡΡΠ΅ΠΌ ΡΠ°Π±Π»ΠΎΠ½ home.html β ΡΠ°Π·ΠΌΠ΅ΡΡΠΈΠΌ Π»ΠΎΠ³ΠΈΠΊΡ ΠΏΠ°Π³ΠΈΠ½Π°ΡΠΎΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ {% end for %} ΠΈ {% end block content%} Π² ΠΊΠΎΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Π°. ΠΠ°ΠΏΠΈΡΠΈ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ°Π·Π΄Π΅Π»Π΅Π½Ρ Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ:

ΠΡΠ΅ Π±ΡΠ»ΠΎ Π±Ρ Π·Π΄ΠΎΡΠΎΠ²ΠΎ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²ΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ½ ΡΠΎΠ·Π΄Π°Π» β Ρ ΠΏΠ°Π³ΠΈΠ½Π°ΡΠΈΠ΅ΠΉ, Π΅ΡΠ»ΠΈ Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΠΌΠ½ΠΎΠ³ΠΎ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² blog\views.py ΠΈΠΌΠΏΠΎΡΡ get_object_or_404
ΠΈ Π½ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ:
class UserPostListView(ListView):
model = Post
template_name = 'blog/user_posts.html' # <app>/<model>_<viewtype>.html
context_object_name = 'posts'
paginate_by = 5
def get_queryset(self):
user = get_object_or_404(User, username=self.kwargs.get('username'))
return Post.objects.filter(author=user).order_by('-date_posted')
Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΡΠ°Π±Π»ΠΎΠ½ user_posts.html ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π½ΠΎΠ²ΡΠΉ ΠΏΡΡΡ Π² ΡΠ°ΠΉΠ»Π΅ blog\urls.py:
path('user/<str:username>', UserPostListView.as_view(), name='user-posts').
ΠΡΡΠ°Π»ΠΎΡΡ Π²Π½Π΅ΡΡΠΈ ΠΏΠΎΠΏΡΠ°Π²ΠΊΡ Π² Π΄Π°Π½Π½ΡΠ΅ Π°Π²ΡΠΎΡΠ° Π² ΡΠ°Π±Π»ΠΎΠ½ home.html:
<a class="mr-2" href="{% url 'user-posts' post.author.username %}">{{ post.author }}</a>
ΠΈ Π² post_detail.html:
<a class="mr-2" href="{% url 'user-posts' object.author.username %}">{{ object.author }}</a>.
Π Π²ΡΠ΅ Π·Π°ΡΠ°Π±ΠΎΡΠ°Π»ΠΎ:

ΠΠ΅ΡΡ ΠΊΠΎΠ΄ Π΄Π»Ρ ΡΠ΅ΡΠ²Π΅ΡΡΠΎΠ³ΠΎ ΡΡΠ°ΠΏΠ° ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡΡ Π·Π΄Π΅ΡΡ.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΠΎΡΡΠ°ΠΏΠ½ΠΎΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π±ΡΡΡΡΠΎ ΠΎΡΠ²ΠΎΠΈΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Π² Django. Π€ΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΠ»ΠΎΠΆΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, CRUD, β Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΠΎΡΠΌΡ ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΆΠΈΠΌΠ°ΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ. ΠΠ°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ, ΡΡΠΎ ΠΊΠΎΠ΄ Π΄Π»Ρ Π²ΡΠ΅Ρ ΡΡΠ°ΠΏΠΎΠ² ΠΏΡΠΎΠ΅ΠΊΡΠ° Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π·Π΄Π΅ΡΡ.
ΠΠ°ΡΠ΅ΡΠΈΠ°Π»Ρ ΠΏΠΎ ΡΠ΅ΠΌΠ΅
- Django Junior: ΠΏΡΡΡ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡΠ΅Π³ΠΎ
- ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½Π°Ρ Π·Π°Π³ΡΡΠ·ΠΊΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Π² Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π½Π° Django
- Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π½ΡΠΉ Π²ΠΈΠ΄Π΅ΠΎΠΊΡΡΡ ΠΏΠΎ Django ΠΎΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π΄ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°
ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ
Π·Π΄ΡΠ°Π²ΡΡΠ²ΡΠΉΡΠ΅ Π° ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎΠ±Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π»ΡΡ ΠΏΠΎΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½ΡΠΆΠ½ΠΎΠ³Π» ΡΠ΅Π±Π΅ ΡΠΈΡΠ»Π°?
views.py:
urls.py:
Π¨Π°Π±Π»ΠΎΠ½:
ΠΠ΄ΡΠ°Π²ΡΡΠ²ΡΠΉΡΠ΅, ΡΠ΅ΡΠΈΠ» ΠΏΠΎΠ²ΡΠΎΡΠΈΡΡ Π²Π°Ρ ΠΊΠΎΠ΄ ΡΡΠΎ Π±Ρ Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ Π΅Π³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΏΠΎΠ΄ ΡΠ΅Π±Ρ(css) Π½ΠΎ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠ΅ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΊ ΡΠ΅Π±Π΅ Π½Π° ΡΠ°Π±ΠΎΡΠΈΠΉ ΡΡΠΎΠ» Ρ ΠΌΠ΅Π½Ρ ΠΏΠΈΡΠ΅Ρ Π²ΠΎΡ ΡΠ°ΠΊΡΡ ΠΎΡΠΈΠ±ΠΊΡ ΠΏΠΎΡΠ»Π΅ Π½Π°ΠΆΠ°ΡΠΈΡ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ "ΠΏΡΠΎΡΠΈΠ»Ρ".
ΠΠΊΠΊΠ°ΡΠ½Ρ ΡΡΠΏΠ΅ΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ (Π°Π΄ΠΌΠΈΠ½Π°) ΡΠΎΠ·Π΄Π°Π½?
ΠΠ°
Π·Π°ΠΉΠ΄ΠΈΡΠ΅ Π² Π°Π΄ΠΌΠΈΠ½ΠΊΡ, ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΏΡΠΎΡΠΈΠ»Ρ Π²ΡΡΡΠ½ΡΡ.
Π‘Π΅ΠΉΡΠ°Ρ ΠΏΠΎΠΏΡΠΎΠ±ΡΡ
ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ Π²Ρ ΠΎΠ΄Π΅ Π² Π°Π΄ΠΌΠΈΠ½ ΠΏΠ°Π½Π΅Π»Ρ
ΠΠΎΠΆΠ½ΠΎ Π²Ρ Π½Π°ΠΏΠΈΡΠΈΡΠ΅ ΠΌΠ½Π΅ Π² ΡΠ΅Π»Π΅Π³ΡΠ°ΠΌΠΌΠ΅? Π° Ρ Π²Π°ΠΌ ΡΠΊΠΈΠ½Ρ Π·ΠΈΠΏΠΊΡ, ΡΠ°ΠΌΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠΈΡΠ΅
@aut_li
ΠΎΠΊ, ΡΠΊΠΈΠ΄ΡΠ²Π°ΠΉΡΠ΅ - @natkaida
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ ΠΎΠ³ΡΠΎΠΌΠ½ΠΎΠ΅ Π·Π° ΡΠ°ΠΊΠΎΠΉ ΡΡΡΠΎΡΠΈΠ°Π»
ΠΡΠΈΠ±ΠΊΠ°, Django ΠΏΠΎΡΠ΅ΠΌΡ-ΡΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΉΡΠΈ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ ΠΊΠΎΡΠΎΡΡΠ΅ Ρ Π·Π°Π³ΡΡΠΆΠ°Ρ. ΠΠΈΡΠ΅Ρ: Not Found: /media/profile_pics/Django-Unchained-2012.jpg ΠΠΎΠΌΠΎΠ³ΠΈΡΠ΅ ΠΏΠΆ
ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΠΌΠΈ ΠΌΠ΅Π΄ΠΈΠ°-ΠΏΠ°ΠΏΠΊΠΈ Π² settings.py ΠΈ/ΠΈΠ»ΠΈ Π² urls.py ΠΏΡΠΎΠ΅ΠΊΡΠ°. ΠΡΠΈΠ½Π΅ΡΠΈΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ, ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌΡΡ:).
ΠΠΎΠ΄ΡΠΊΠ°ΠΆΠΈΡΠ΅, ΠΏΠΎΠΆΠ°Π»ΡΠΉΡΡΠ° ΠΏΠΎ ΠΈΠΌΠΏΠΎΡΡΡ ΠΏΠΎΡΡΠΎΠ² ΠΈΠ· json. ΠΡΠ΄Π°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ (ΡΠΊΡΠΈΠ½ ΠΏΡΠΈΠΊΡΠ΅ΠΏΠΈΠ»Π°). ΠΡΠ»ΠΈ ΡΡΠ°Π²Π»Ρ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΏΡΠΎΡΡΡ ==, Π²ΡΠ΄Π°Π΅Ρ, name 'title' is not defined. Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ
ΡΠ΅ΡΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ?
ΠΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ Π½Π°Π΄ΠΎ Π½Π°ΡΠ°ΡΡ Π²ΡΠ΅ ΡΠ½Π°ΡΠ°Π»Π°, Ρ ΠΈΠΌΠΏΠΎΡΡΠ° import json, Ρ.ΠΊ. ΠΊΠΎΠ½ΡΠΎΠ»Ρ ΡΠΆΠ΅ ΠΏΠΎΡΠ΅ΡΡΠ»Π° ΡΠ²ΡΠ·Ρ ΠΎΡΠΊΡΡΡΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Ρ ΡΠΈΠΊΠ»ΠΎΠΌ:). ΠΡΠΎΡΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΈΠΌΠΏΠΎΡΡΠΎΠΌ ΠΈΠ· ΡΠ°ΠΉΠ»Π°, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΡΡΡ ΠΏΠΎΠΊΠ°Π·Π°Π»Π° Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°Ρ ΡΠ°Π½Π΅Π΅, 22 ΡΠ½Π²Π°ΡΡ.
ΡΠ°ΠΌ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΎΡΠΈΠ±ΠΊΠ°. ΠΠ΅ Π΄ΡΠΌΠ°Ρ ΡΡΠΎ Π²Ρ ΠΏΡΠΎΡΡΠ΅ΡΠ΅ ΠΌΠΎΠΉ ΠΊΠΎΠΌΠ΅Π½Ρ Π½ΠΎ ΠΏΡΠΎΡΡΠΎ ΠΊΠΎΠΏΠΈΡΡΠΉΡΠ΅ Π²ΠΎΡ ΡΡΠΎ post = Post(title=post['title'], content=post['content'], author_id=post['user_id']) ΠΈ Ρ Π²Π°Ρ Π²ΡΠ΅ Π·Π°ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
ΠΠ΄Π°Π³ΠΎΠ΄Π°ΡΡ Π·Π° ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»! Π‘ΠΊΠ°ΠΆΠΈΡΠ΅, Π° ΠΊΠ°ΠΊ ΠΏΠΎΠΏΠ°ΡΡΡ Π² ΠΏΠ°ΠΏΠΊΡ media?
ΠΠ°ΠΏΠΊΠ° media Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅ Ρ ΠΏΠ°ΠΏΠΊΠ°ΠΌΠΈ blog, my_site ΠΈ ΡΠ°ΠΉΠ»ΠΎΠΌ manage.py:
ΡΠΏΠ°ΡΠΈΠ±ΠΎ!!
ΠΊΠ°ΠΊ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡΡΠΎΠ²? Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ
ΠΡΠΈΠΌΠ΅Ρ Ρ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ (ΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ ΡΠΈΠΏΠ° Π»Π°ΠΉΠΊΠΎΠ², ΠΠ‘ ΠΈ Ρ.Π΄.) Π² ΡΡΠΎΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅ - https://proglib.io/p/sozdaem-rekrutingovyy-portal-na-django-chast-1-2022-07-18
ΠΠ΄ΡΠ°Π²ΡΡΠ²ΡΠΉΡΠ΅, ΡΠΏΠ°ΡΠΈΠ±ΠΎ Π±ΠΎΠ»ΡΡΠΎΠ΅ Π·Π° ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΠΉ ΡΡΡΠΎΡΠΈΠ°Π». ΠΠ΄ΠΈΠ½ Π²ΠΎΠΏΡΠΎΡ ΠΎΡΡΠ°Π»ΡΡ. Π’Π΅ΠΏΠ΅ΡΡ Ρ Π½Π΅ ΠΌΠΎΠ³Ρ Π·Π°ΠΉΡΠΈ Π² Π°Π΄ΠΌΠΈΠ½ ΠΏΠ°Π½Π΅Π»Ρ ΠΈΠ·-Π·Π° ΡΠΎΠ³ΠΎ, ΡΡΠΎ Ρ Π½Π΅Π³ΠΎ Π½Π΅Ρ ΠΏΡΠΎΡΠΈΠ»Ρ ΠΊΠ°ΠΊ Π±ΡΡΡ Π² ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅? ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΡΠΏΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ?
ΠΠ°, Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΡΠΏΠ΅ΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. ΠΡΠ»ΠΈ Π±Π°Π·Ρ Π΅ΡΠ΅ Π½Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Π»ΠΈ, ΡΠΎ ΡΠ°ΠΊ:
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΡΡΡΠΎΡΠΈΠ°Π»! ΠΠΎΠ΄ΡΠΊΠ°ΠΆΠΈΡΠ΅ ΠΏΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΠΏΠΎΡΠ΅ΠΌΡ ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ ΠΏΠΎΡΡΡ ΠΈΠ· json-ΡΠ°ΠΉΠ»Π° ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠ½ΡΠΎΠ»Ρ Π²ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Π° Π΅ΡΠ»ΠΈ ΡΠΎΠ·Π΄Π°ΡΡ python ΡΠ°ΠΉΠ» Ρ ΡΠ°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΊΠΎΠ΄ΠΎΠΌ - Π½Π΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΡ - Π²ΡΠ΄Π°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ:
raise ImproperlyConfigured(django.core.exceptions.ImproperlyConfigured: Requested setting AUTH_USER_MODEL, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
Π’.Π΅. Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΡΡΠΎΡΠΊΠ° from blog.models import Post
ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΠΊΡΠΈΠΏΡΡ Π΄Π»Ρ Π·Π°Π³ΡΡΠ·ΠΊΠΈ Π΄Π°Π½Π½ΡΡ Π² Π±Π°Π·Ρ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ json, ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ ΠΏΠΎ-Π΄ΡΡΠ³ΠΎΠΌΡ (Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΠΊΠ°Π·Π°Π½Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΌΠΎΠ΄Π΅Π»Ρ). ΠΡΡΠ°ΡΠΈ, Π² Django Π΅ΡΡΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ Π·Π°Π³ΡΡΠ·ΠΊΠΈ Π΄Π°Π½Π½ΡΡ ΠΈΠ· ΡΠ°ΠΉΠ»Π°, Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ fixtures. ΠΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΈΠΌ ΡΠ°ΠΊ - Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ fixtures Π²Π½ΡΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²Π½ΡΡΡΠΈ ΠΏΠ°ΠΏΠΊΠΈ blog), ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
manage.py loaddata posts.json
. Π‘Π°ΠΌ json ΠΏΡΠΈ ΡΡΠΎΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ°ΠΊ:Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π½Π° ΡΠΊΡΠΈΠ½Π΅.
Π ΠΊΠ°ΠΊ ΠΏΡΠΈ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΡΡΠ°Π·Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠΎΡΠΎ ΠΏΡΠΎΡΠΈΠ»Ρ? ΠΠΎΠ±Π°Π²Π»ΡΡ Π² ΡΠΎΡΠΌΡ ΠΏΠΎΠ»Π΅ image=form.ImageField(), Π½ΠΎ Π²ΠΎ views Π½Π΅ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡΡ ΡΠΎΡΠΌΡ
Π forms.py, Π² ΠΊΠ»Π°ΡΡΠ΅ Meta ΠΏΡΠΎΡΠΈΠ»Ρ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ ΠΏΠΎΠ»Π΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
Π models.py Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ:
ΠΠΎ views.py Π² ΡΡΠ½ΠΊΡΠΈΠΈ register ΡΡΠ΅Π΄ΠΈ ΠΏΡΠΎΡΠ΅Π³ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ:
Π ΡΠ°Π±Π»ΠΎΠ½Π΅ Π΄Π»Ρ ΡΠΎΡΠΌΡ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΠΌΠ΅ΡΠΎΠ΄ POST ΠΠΠ―ΠΠΠ’ΠΠΠ¬ΠΠ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠΊΠ°Π·Π°Π½ Ρ
enctype="multipart/form-data"
, ΠΊΠ°ΠΊ Π² ΡΠ°Π±Π»ΠΎΠ½Π΅ ΠΏΡΠΎΡΠΈΠ»Ρ.ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Ρ Π²ΡΡΠ°Π²Π»ΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΉ ΠΊΠΎΠ΄ Ρ ΡΠΎΡΠΌΠ°ΠΌΠΈ, Ρ ΠΌΠ΅Π½Ρ ΠΏΠΎΡΡΠΎΡΠ½Π½Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ° django.core.exceptions.ImproperlyConfigured: Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is prohibited; form UserUpdateForm needs updating. Π ΡΠ΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°?
ΠΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠΎΡΠΌΡ Π½Π΅ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Ρ ΠΏΠΎΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ Π² Π½Π΅Π΅ Π½ΡΠΆΠ½ΠΎ Π²ΠΊΠ»ΡΡΠΈΡΡ (Π° ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΊΠ»ΡΡΠΈΡΡ). Π£ Π²Π°Ρ Π² forms.py ΠΏΠΎΠ»Ρ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Ρ? ΠΡΠ»ΠΈ ΠΊΠΎΠ΄ ΡΠ°ΠΊΠΎΠΉ, ΠΊΠ°ΠΊ ΠΈ Π½Π° ΠΠΈΡΡ Π°Π±Π΅, Π²ΠΏΠΎΠ»Π½Π΅ Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΡΡΠΎ ΡΡΠΎ ΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΡΠΎΡΠΈΠ»Ρ Π±Π΅Π· ΡΠΈΠ³Π½Π°Π»Π° (ΡΡΠΎ-ΡΠΎ ΡΠ°ΠΌ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π»ΠΎΡΡ ΠΈ ΡΠ΅ΠΏΠ΅ΡΡ Π½Π΅ Ρ ΠΎΡΠ΅Ρ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡΡΡ).
Ρ ΠΌΠ΅Π½Ρ ΡΠΎΠΆΠ΅ ΡΠ°ΠΊΠΎΠ΅ Π±ΡΠ»ΠΎ, ΡΠ°ΠΌ Π½Π°Π΄ΠΎ Π²ΡΡΠΎΠ²Π½ΡΡΡ ΠΎΡΡΡΡΠΏΡ ΡΡΡΠΎΠΊ ΠΊΠΎΠ΄Π°
ΠΠΎΠ΄ΡΠΊΠ°ΠΆΠΈΡΠ΅ Π½ΠΎΠ²ΠΈΡΠΊΡ, ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΈΠ³Π½Π°Π»Ρ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠΈΠ»Ρ? Π― Π½Π΅ ΡΠ»ΡΡΠ°Π» ΠΎ ΡΠΈΠ³Π½Π°Π»Π°Ρ Π΄ΠΎ ΡΡΠΎΠ³ΠΎ ΡΡΡΠΎΡΠΈΠ°Π»Π° ΠΈ ΠΌΠ½Π΅ ΡΡΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΠ»ΠΎΠΆΠ½ΡΠΌ ΠΈ Ρ ΠΏΡΠΎΡΡΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΡΡΠΎΡ ΠΊΠΎΠ΄ Π²ΠΎ views.register Profile(user=User.objects.get(username=form.cleaned_data['username']),).save() ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ Π½ΠΎΠ²ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° Profile Π² ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ ΡΠΎΡ ΡΠ°Π½ΡΡ Π΅Π³ΠΎ Π² ΠΠ. ΠΡΠΎ Ρ ΠΎΡΠΎΡΠ°Ρ ΠΏΡΠ°ΠΊΡΠΈΠΊΠ° ΠΈΠ»ΠΈ Π½Π΅Ρ?
ΠΠ±ΡΠ΅ΠΏΡΠΈΠ½ΡΡΠ°Ρ ΠΏΡΠ°ΠΊΡΠΈΠΊΠ° - ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΈΠ³Π½Π°Π»Ρ Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΡΠΎΡΠΈΠ»Ρ. Π ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΈ Π½Π΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΠΎΡΠΈΠ±ΠΊΠ΅ - ΠΏΠΎΡΠ΅ΠΌΡ Π±Ρ ΠΈ Π½Π΅Ρ:).
Ρ ΠΌΠ΅Π½Ρ ΠΏΡΠΈ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π½Π΅ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΏΡΠΎΡΠΈΠ»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ (ΠΊΠ°ΠΊ Ρ ΠΏΠΎΠ½ΡΠ»)
Π΅ΡΠ»ΠΈ Ρ ΠΊΠΎΠ³ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΎ ΡΠ°ΠΊΠΎΠ΅, ΡΠΎ Π² models.py
Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ Π½Π°
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ! ΠΡΠ»ΠΈΡΠ½ΡΠΉ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π». Π’Π΅ΠΏΠ΅ΡΡ Π±Ρ Π΅ΡΠ΅ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ ΠΊΠ°ΠΊ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΠΏΠ΅ΡΠ²ΡΠ΅ 300 ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΡΡΠ°ΡΡΠΈ ΠΈ ΡΡΡΠ»ΠΊΡ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΠ°.
Π‘Π΄Π΅Π»Π°ΡΡ ΠΊΠ½ΠΎΠΏΠΊΡ "ΡΠΈΡΠ°ΡΡ Π΄Π°Π»ΡΡΠ΅" ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΡ ΠΏΡΠ΅Π²ΡΡ ΠΏΠΎΡΡΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ - Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² ΡΠ°Π±Π»ΠΎΠ½ home.html ΡΠΈΠ»ΡΡΡ slice - Ρ ΠΌΠ΅Π½Ρ ΡΠ°ΠΌ 200 ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²:
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ ΠΎΠ³ΡΠΎΠΌΠ½ΠΎΠ΅ Π·Π° ΡΠ°ΠΊΠΎΠΉ ΡΡΡΠΎΡΠΈΠ°Π»! ΠΡΠ΅Π½Ρ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ, ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΈ ΠΏΠΎΠ½ΡΡΠ½ΠΎ!
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ! ΠΡΠ΅ Π±Ρ Π²ΡΠ΅ ΡΠΎΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΡΠΎΠ»ΡΠΊΠΎ Π² Π²ΠΈΠ΄Π΅ΠΎΡΠΎΡΠΌΠ°ΡΠ΅, Π±ΡΠ»ΠΎ Π±Ρ ΠΊΡΡΡΠΎ.
ΠΠ°, ΠΏΠ»Π°Π½ΠΈΡΡΡ Π² ΡΠΊΠΎΡΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π΄Π΅Π»Π°ΡΡ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ ΡΠΎΠΆΠ΅:).
from django.db.models.signals import post_save from django.contrib.auth.models import User from django.dispatch import receiver from .models import Profile
(post_save, sender=User) def create_profile(sender, instance, created, **kwargs): if created: Profile.objects.create(user=instance)
(post_save, sender=User) def save_profile(sender, instance, **kwargs): instance.profile.save()
Π ΠΊΠ°ΠΊ Π·Π΄Π΅ΡΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡ Π±Π΅Π· ΠΈΠΌΠΏΠΎΡΡΠ°, ΠΊΠ°ΠΊ Π² ΠΏΡΠΎΡΠ»ΠΎΠΉ ΡΠ°ΡΡΠΈ? ΠΠΎΡΡΠ½ΠΈΡΠ΅ ΠΏΠΎΠΆ. Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ ΠΏΠΎΠ½ΡΡΠ½ΠΎ.
Π‘ΠΈΠ³Π½Π°Π»Ρ ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΡΡΡΡ Π² users/apps.py.
ΠΠΎΠ»ΡΡΠΎΠ΅ ΡΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΡΠ°ΠΊΠΎΠΉ ΡΡΡΠΎΡΠΈΠ°Π» !!! ΠΠ»Ρ Π½Π°ΡΠΈΠ½Π°ΡΡΠΈΡ ΡΠ°ΠΌΠΎΡΡΠ΅ΠΊ Π²ΡΠΎΠ΄Π΅ ΠΌΠ΅Π½Ρ ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ ΠΌΠ°Π½Π½Π° Π½Π΅Π±Π΅ΡΠ½Π°Ρ !!!
ΠΠ° ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π½Π΅Π΄Π΅Π»Π΅ Π²ΡΠΉΠ΄Π΅Ρ Π½ΠΎΠ²ΡΠΉ ΠΠΆΠ°Π½Π³ΠΎ-ΡΡΡΠΎΡΠΈΠ°Π» - ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠ»ΠΎΠΆΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° Ρ ΠΌΠ΅ΡΡΠ΅Π½Π΄ΠΆΠ΅ΡΠΎΠΌ, ΠΏΠΎΠΈΡΠΊΠΎΠΌ ΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΏΠ»ΡΡΠΊΠ°ΠΌΠΈ:).
ΠΠ΄ΡΠ°Π²ΡΡΠ²ΡΠΉΡΠ΅. ΠΠ΄Π΅ Π½Π°ΠΉΡΠΈ ΡΡΠ°ΡΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠ»ΠΎΠΆΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° Ρ ΠΌΠ΅ΡΡΠ΅Π½Π΄ΠΆΠ΅ΡΠΎΠΌ?
ΠΠΎΡ ΠΏΠ΅ΡΠ²Π°Ρ ΡΠ°ΡΡΡ - https://proglib.io/p/sozdaem-rekrutingovyy-portal-na-django-chast-1-2022-07-18
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ βοΈ
ΠΡΠ»ΠΈΡΠ½Π°Ρ ΡΡΠ°ΡΡΡ. ΠΠ°ΠΏΠΈΡΠΈΡΠ΅ ΠΏΠΎΠΆΠ°Π»ΡΠΉΡΡΠ° Π΅ΡΡ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΡΠΈΠΊΡΡΡΠΈΡΡ SPA Π½Π° JavaScript ΠΊ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° Django
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ:). Π‘ΠΊΠΎΡΠΎ Π±ΡΠ΄Π΅Ρ ΡΡΠ°ΡΡΡ ΠΏΡΠΎ SPA Π½Π° Π€Π»Π°ΡΠΊΠ΅, Π½ΠΎ Π΄Π°, ΠΈ ΠΏΠΎ ΠΠΆΠ°Π½Π³ΠΎ Π½Π°Π΄ΠΎ Π±ΡΠ΄Π΅Ρ Π½Π°ΠΏΠΈΡΠ°ΡΡ:).
ΠΠ΄ΡΠ°Π²ΡΡΠ²ΡΠΉΡΠ΅, Ρ ΡΠ΅ΠΏΠ΅ΡΡ ΠΊΠΎΠ³Π΄Π° ΠΏΡΡΠ°ΡΡΡ Π·Π°ΠΉΡΠΈ Π² Π°Π΄ΠΌΠΈΠ½ΠΊΡ, ΠΈΠ»ΠΈ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡΡΡ Ρ ΠΌΠ΅Π½Ρ Π²ΡΠΊΠΈΠ΄ΡΠ²Π°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ
ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΠ΅ΡΠ½ΡΡ Π·Π°ΠΏΠΈΡΡ Π°Π΄ΠΌΠΈΠ½Π°-ΡΡΠΏΠ΅ΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. ΠΡΠ»ΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠ° ΡΠΈΠΏΠ° TypeError: save() got an unexpected keyword argument 'force_insert', Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΌΠ΅ΡΠΎΠ΄ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΡΠΈΠ»Π΅ΠΉ: def save(self, *args, *kwargs): super(Profile, self).save(args, **kwargs)
ΠΡ Π½Π΅ ΠΏΠΎΠ²Π΅ΡΠΈΡΠ΅ Ρ Π½ΠΎΡΡΡ ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π», Π½ΠΎ ΠΏΠΎΡΠ΅ΠΌΡ ΡΠΎ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ Π²ΡΠΊΠΈΠ΄ΡΠ²Π°Π»ΠΎ, ΡΠ΅ΠΉΡΠ°Ρ Π²ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ)) ΠΏΠΎΠ΄ΡΠΊΠ°ΠΆΠΈΡΠ΅ Π° ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅ΠΉΡΠ°Ρ Π½Π° Π³Π»Π°Π²Π½ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ ΠΏΡΠΈΠΊΡΡΡΠΈΡΡ ΡΠ΅ΡΠ²ΠΈΡ Π΄Π»Ρ ΡΠΎΠΊΡΠ°ΡΠ΅Π½ΠΈΡ ΡΡΡΠ»ΠΎΠΊ ΠΈ ΡΡΠΎΠ±Ρ Ρ Π°Π²ΡΠΎΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π² Π°ΠΊΠΊΠ°ΡΠ½ΡΠ΅ ΡΠΎΡ ΡΠ°Π½ΡΠ»Π°ΡΡ ΠΈΡΡΠΎΡΠΈΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΊΠΎΡΠΎΡΠΊΠΈΡ ΡΡΡΠ»ΠΎΠΊ?
ΠΡΠΎ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΎΠ±ΡΠ΅ΠΌΠ½Π°Ρ ΡΠ°Π±ΠΎΡΠ°. ΠΠΊΠ»ΡΡΡ ΡΠ°ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π² ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ². ΠΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΡΠ΄Π΅Π»Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄Π²ΡΡ Π³ΠΎΡΠΎΠ²ΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ - django-simple-history ΠΈ django-link-shortener, Π° Π²ΠΎΡ Π·Π΄Π΅ΡΡ Π°Π²ΡΠΎΡ ΡΠ΄Π΅Π»Π°Π» Ρ ΠΏΠΎΠΌΠΎΡΡΡ Graphene-Django - https://www.digitalocean.com/community/tutorials/how-to-create-a-url-shortener-with-django-and-graphql-ru.
ΠΠ΄ΡΠ°ΡΡΠ²ΡΠΉΡΠ΅. ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ΄ΡΠΊΠ°Π·Π°ΡΡ ΠΊΠ°ΠΊ Π΄ΠΎΠ²ΠΈΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π² class PostCreateView(LoginRequiredMixin, CreateView): model = Work form_class = UserFormWorks template_name = 'profilecreate_project.html' success_url = reverse_lazy('users_profile')
ΠΠ»Ρ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ enctype="multipart/form-data" Π² ΡΠ°Π±Π»ΠΎΠ½. Π ΠΏΡΡΡ ΠΊ ΠΏΠ°ΠΏΠΊΠ΅ Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ. ΠΠΎΡΠΎΡΠ΅, Π²ΠΎΡ ΡΠ°ΠΊ: https://learndjango.com/tutorials/django-file-and-image-uploads-tutorial
Ρ ΠΌΠ΅Π½Ρ ΡΡΠΎ Π΅ΡΡΡ, ΠΌΠ΅Π½Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠΎΡΠΌΡ Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΠ»Π°ΡΡΠΎΠ². View. Π²ΠΈΠ΄Π΅Π» ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ΅Π· Π€ΡΠ½ΠΊΡΠΈΡ ΡΡΠΎ ΠΈΡ ΠΏΠΈΡΡΡ. Π― Π½Π°ΠΏΠΈΡΠ°Π» ΠΏΠΎ Π²Π°ΡΠ΅ΠΌΡ ΠΏΡΠΈΠΌΠ΅ΡΡ Ρ ΠΌΠ΅Π½Ρ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΡΠΎΡΠΌΠ°, Π½ΠΎ Π½Π΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅. Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° Π£ΡΠΎΠΊ! ΠΡΠ»ΠΈ Π½Π΅ ΡΠ»ΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΠΉΡΠ΅ Π³Π°ΠΉΠ΄ ΠΏΠΎ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅ΡΠ΅Π· google ΠΈ meta.
ΠΠΎΠΆΠ΅Ρ, Π·Π°Π³ΡΡΠ·ΠΈΡΠ΅ ΠΊΠΎΠ΄ Π½Π° Π³ΠΈΡΡ Π°Π±, Ρ ΡΠ΅Π±Π΅ ΠΏΠΎΡΡΠ°Π²Π»Ρ ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΡ, Π² ΡΠ΅ΠΌ ΡΠ°ΠΌ Π΄Π΅Π»ΠΎ? ΠΡΠΎ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ - ΠΎΡΠ»ΠΈΡΠ½Π°Ρ ΠΈΠ΄Π΅Ρ, Π½Π°ΠΏΠΈΡΡ:).
https://github.com/NickManibus/SellArt/blob/main/user/views.py
Π²ΠΎΡ. Π±ΡΠ΄Ρ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ Π·Π° ΠΏΠΎΠΌΠΎΡΡ.
ΠΠΎΡ ΡΠ°ΠΊ Π²ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΈ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎ ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ Ρ ΡΡΠΎΠ½ΡΠ΅Π½Π΄Π°. Π‘ΠΎΡΡΠΈ Π·Π° ΠΊΠ°ΡΡΠΈΠ½ΠΊΡ, ΠΡΠΎΠ³Π»ΠΈΠ± Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΅Π½Π΄Π΅ΡΠΈΡ ΠΊΠΎΠ΄ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ :
ΠΠΎΡ ΡΠΊΡΠΈΠ½ΡΠΎΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° - Π²ΡΠ΅ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ Π±ΡΠ»ΠΈ Π·Π°Π³ΡΡΠΆΠ΅Π½Ρ Ρ ΡΡΠΎΠ½ΡΠ΅Π½Π΄Π°:
ΠΠΎΠ»ΡΡΠΎΠ΅ ΡΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΠΏΠΎΠΌΠΎΡΡ) Ρ ΠΏΡΡΠ°Π»ΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ Π±Ρ Π²ΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π·Π°Π³ΡΡΠΆΠ°Π»ΠΈΡΡ ΡΠ΅ΡΠ΅Π· ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ»Π΅, Π½ΠΎ ΡΡΠΎ ΡΠΎΠΆΠ΅ ΠΎΠΊΠ°Π·Π°Π»ΡΡ Π²ΡΡ ΠΎΠ΄.)
ΠΡΡΡ ΠΌΠΎΠ΄ΡΠ»ΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ - django-galleryfield ΠΈ ckeditor, ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ Π΅ΡΠ΅ ΠΈ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΠΎΠ΅ rtf ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ.