Как я могу автоматически добавить информацию о пользователе в модель в Django?

В моем проекте есть статус и пользовательские приложения, и все статусы, очевидно, создаются конкретными пользователями. Я хочу сохранить информацию о создателях статусов (id) в своей базе данных, но я не знаю, как добавить ее автоматически - без поля в форме. Как будто я только что прошел аутентификацию, я создаю статус, и моя база данных знает, что это был я. Я пытался сделать это с помощью параметра initial, но ничего не вышло. Файлы, которые я прикрепил, взяты из приложения status

views.py

...
class StatusCreateView(View):
    def get(self, request, *args, **kwargs):
        form = StatusForm()
        return render(request, "statuses/create.html", {"form": form})

    def post(self, request, *args, **kwargs):
        form = StatusForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect("statuses_list")
        return render(request, "statuses/create.html", {"form": form})
...

urls.py

...
urlpatterns = [
    path("", views.IndexView.as_view(), name="statuses_list"),
    path("create/", views.StatusCreateView.as_view(), name="statuses_create"),
...
]

models.py

from django.db import models


# Create your models here.
class Status(models.Model):
    name = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    author = models.ForeignKey(
        "user.CustomUser",
        on_delete=models.CASCADE,
        related_name='status_related_author'
    )

forms.py

from django.forms import ModelForm
from .models import Status


class StatusForm(ModelForm):
    class Meta:
        model = Status
        fields = ["name"]

templates/statuses/create.html

{% if form.errors %}
<div>
    <ul>
    {% for error in form.errors %}
        <li><strong>{{ error|escape }}</strong></li>
    {% endfor %}
    </ul>
</div>
{% endif %}
<form action="{% url 'statuses_create' %}" method="post">
    {% csrf_token %}
    <table border="1">
    {{ form }}
    </table>
    <input type="submit" value="Создать">
</form>

Сначала я бы посоветовал сделать author недоступным для редактирования, а затем:

class Status(models.Model):
    name = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    author = models.ForeignKey(
        'user.CustomUser',
        editable=False,
        on_delete=models.CASCADE,
        related_name='status_related_author',
    )

хотя это и не обязательно, это облегчает вашу жизнь, потому что теперь это не будет отображаться в ModelForm, даже если fields = __all__.

Далее в представлении вы можете ввести имя автора в .instance из form, таким образом:

class StatusCreateView(View):
    def get(self, request, *args, **kwargs):
        form = StatusForm()
        return render(request, 'statuses/create.html', {'form': form})

    def post(self, request, *args, **kwargs):
        form = StatusForm(request.POST)
        if form.is_valid():
            form.instance.author = self.request.user
            form.save()
            return redirect('statuses_list')
        return render(request, 'statuses/create.html', {'form': form})

Для этого, конечно, потребуется, чтобы пользователь прошел аутентификацию, и мы можем отказаться от многих шаблонов с помощью CreateView:

from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic.edit import CreateView


class AuthorCreateView(LoginRequiredMixin, CreateView):
    model = Status
    fields = ['name']
    template_name = 'statuses/create.html'
    success_url = reverse_lazy('statuses_list')

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)
<время работы/>

Примечание: Обычно лучше использовать settings.AUTH_USER_MODEL [Django-doc] для ссылки на пользовательскую модель, чем использовать User model [Django-doc] напрямую. Для получения дополнительной информации вы можете ознакомиться с ссылка на раздел документации User модель.

Вернуться на верх