Как я могу автоматически добавить информацию о пользователе в модель в 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] для ссылки на пользовательскую модель, чем использоватьUsermodel [Django-doc] напрямую. Для получения дополнительной информации вы можете ознакомиться с ссылка на раздел документацииUserмодель.