مقدمه

اکنون که کاربران می‌توانند در وب‌سایت ما حساب کاربری ایجاد کرده و وارد شوند، باید داده‌هایی را که ایجاد می‌کنند به حساب کاربری آنها متصل کنیم. ما می‌خواهیم که هر کاربر فقط بتواند موضوعات و یادداشت‌های خودش را ببیند و ویرایش کند. این کار نیازمند افزودن یک رابطه بین مدل‌های ما و مدل کاربر داخلی Django است.

افزودن فیلد مالک به مدل Topic

اولین قدم، افزودن یک فیلد owner به مدل Topic است. این فیلد یک کلید خارجی (ForeignKey) به مدل User داخلی Django خواهد بود.

Copy Icon learning_logs/models.py
from django.contrib.auth.models import User

class Topic(models.Model):
    # ... (text and date_added fields) ...
    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 استفاده می‌کنیم.

Copy Icon 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) نیز بررسی کنیم که آیا کاربر لاگین کرده است یا خیر و بر اساس آن، لینک‌های مناسب را نمایش دهیم.

Copy Icon 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 را طوری تغییر دهیم که هنگام ذخیره یک موضوع جدید، کاربر فعلی را به عنوان مالک آن ثبت کند.

Copy Icon learning_logs/views.py
@login_required
def new_topic(request):
    # ... (GET request logic) ...
    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)
    # ... (render form) ...

در اینجا، ما با فراخوانی form.save(commit=False) یک نمونه از مدل را بدون ذخیره آن در پایگاه‌داده ایجاد می‌کنیم. سپس، فیلد owner آن را برابر با کاربر فعلی قرار داده و در نهایت، با فراخوانی new_topic.save() آن را در پایگاه‌داده ذخیره می‌کنیم.

در این درس، با افزودن مالکیت به داده‌ها و محدود کردن دسترسی بر اساس کاربر لاگین کرده، اپلیکیشن خود را به یک پلتفرم چندکاربره واقعی تبدیل کردیم. با این درس، فصل «ایجاد حساب کاربری در Django» به پایان می‌رسد. در فصل پایانی، به «استایل‌دهی و استقرار اپلیکیشن Django» خواهیم پرداخت و ظاهر اپلیکیشن خود را با استفاده از Bootstrap بهبود داده و آن را برای استقرار روی یک سرور زنده آماده خواهیم کرد.