مقدمه
اکنون که کاربران میتوانند در وبسایت ما حساب کاربری ایجاد کرده و وارد شوند، باید دادههایی را
که ایجاد میکنند به حساب کاربری آنها متصل کنیم. ما میخواهیم که هر کاربر فقط بتواند موضوعات و
یادداشتهای خودش را ببیند و ویرایش کند. این کار نیازمند افزودن یک رابطه بین مدلهای ما و مدل
کاربر داخلی Django است.
افزودن فیلد مالک به مدل Topic
اولین قدم، افزودن یک فیلد owner به مدل Topic است. این فیلد یک کلید خارجی (ForeignKey) به مدل
User داخلی Django خواهد بود.
learning_logs/models.py
from django.contrib.auth.models import User
class Topic(models.Model):
owner = models.ForeignKey(User, on_delete=models.CASCADE)
پس از افزودن این فیلد، باید یک مهاجرت جدید ایجاد و اجرا کنیم تا این تغییر در پایگاهداده اعمال
شود.
(ll_env) $ python manage.py makemigrations learning_logs
(ll_env) $ python manage.py migrate
محدود کردن دسترسی
اکنون باید ویوها و تمپلیتهای خود را طوری تغییر دهیم که کاربران فقط به دادههای خودشان دسترسی
داشته باشند.
محدود کردن دسترسی در ویوها
ما ویوی topics را طوری تغییر میدهیم که فقط موضوعات مربوط به کاربر لاگین کرده فعلی را
نمایش دهد. برای محدود کردن دسترسی به صفحات، از دکوراتور @login_required استفاده میکنیم.
learning_logs/views.py
from django.contrib.auth.decorators import login_required
@login_required
def topics(request):
"""Show all topics."""
topics = Topic.objects.filter(owner=request.user).order_by('date_added')
context = {'topics': topics}
return render(request, 'learning_logs/topics.html', context)
دکوراتور @login_required تضمین میکند که این ویو تنها توسط کاربرانی که لاگین کردهاند قابل
دسترسی است. ما همچنین کوئری را به Topic.objects.filter(owner=request.user) تغییر دادهایم تا
فقط موضوعاتی که مالک آنها کاربر فعلی (request.user) است، انتخاب شوند.
محدود کردن دسترسی در تمپلیتها
ما باید در تمپلیت پایه (base.html) نیز بررسی کنیم که آیا کاربر لاگین کرده است یا خیر و بر
اساس آن، لینکهای مناسب را نمایش دهیم.
learning_logs/templates/learning_logs/base.html
{% if user.is_authenticated %}
Hello, {{ user.username }}.
<a href="{% url 'users:logout' %}">Log out</a>
{% else %}
<a href="{% url 'users:register' %}">Register</a> -
<a href="{% url 'users:login' %}">Log in</a>
{% endif %}
در این کد، با استفاده از user.is_authenticated وضعیت لاگین کاربر را بررسی کرده و لینکهای
متفاوتی را نمایش میدهیم.
اتصال دادههای جدید به کاربر
در نهایت، باید ویوی new_topic را طوری تغییر دهیم که هنگام ذخیره یک موضوع جدید، کاربر فعلی
را به عنوان مالک آن ثبت کند.
learning_logs/views.py
@login_required
def new_topic(request):
else:
form = TopicForm(data=request.POST)
if form.is_valid():
new_topic = form.save(commit=False)
new_topic.owner = request.user
new_topic.save()
return redirect(learning_logs:topics)
در اینجا، ما با فراخوانی form.save(commit=False) یک نمونه از مدل را بدون ذخیره آن در
پایگاهداده ایجاد میکنیم. سپس، فیلد owner آن را برابر با کاربر فعلی قرار داده و در نهایت، با
فراخوانی new_topic.save() آن را در پایگاهداده ذخیره میکنیم.
در این درس، با افزودن مالکیت به دادهها و محدود کردن دسترسی بر اساس کاربر لاگین کرده، اپلیکیشن
خود را به یک پلتفرم چندکاربره واقعی تبدیل کردیم. با این درس، فصل «ایجاد حساب کاربری در Django»
به پایان میرسد. در فصل پایانی، به «استایلدهی و استقرار اپلیکیشن Django» خواهیم پرداخت و ظاهر
اپلیکیشن خود را با استفاده از Bootstrap بهبود داده و آن را برای استقرار روی یک سرور زنده آماده
خواهیم کرد.