Как хранить авто пользователя в базе данных?
Я создал форму для добавления товаров на сайт электронной коммерции. Форма работает не идеально.
Первый вопрос: Я хочу сохранять пользователя автоматически при отправке формы. На самом деле я хочу хранить данные о том, кто добавил продукт индивидуально.
Вторые проблемы: Поле изображения не работает, изображение не сохраняется в базе данных.
Как я могу исправить эти проблемы? Помогите мне
forms.py: from django import forms from .models import Products from django.forms import ModelForm
class add_product_info(forms.ModelForm):
class Meta:
model = Products
fields = ('product_title','product_image')
model.py:
class Products(models.Model):
user = models.ForeignKey(User, related_name="merchandise_product_related_name", on_delete=models.CASCADE, blank=True, null=True)
product_title = models.CharField(blank=True, null=True, max_length = 250)
product_image = models.ImageField(blank=True, null=True, upload_to = "1_products_img")
views.py:
def add_product(request):
if request.method == "POST":
form = add_product_info(request.POST)
if form.is_valid():
form.save()
messages.success(request,"Successfully product added.")
return redirect("add_product")
form = add_product_info
context = {
"form":form
}
return render(request, "add_product.html", context)
templates:
<form action="" method="POST" class="needs-validation" style="font-size: 13px;" novalidate="" autocomplete="off" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<div class="d-flex align-items-center">
<button type="submit" class="btn btn-outline-dark ms-auto" style="font-size:13px;">Add</button>
</div>
</form>
Вам необходимо установить .user
из .instance
, обернутых в форму, на вошедшего пользователя (request.user
). Кроме того, вам необходимо передать форме оба параметра request.POST
и request.FILES
для работы с файлами.
from django.contrib.auth.decorators import login_required
@login_required
def add_product(request):
if request.method == 'POST':
form = add_product_info(request.POST, request.FILES)
if form.is_valid():
form.instance.user = request.user
form.save()
messages.success(request, 'Successfully product added.')
return redirect('add_product')
else:
form = add_product_info()
context = {
'form': form
}
return render(request, 'add_product.html', context)
Я бы также посоветовал не использовать null=True
и blank=True
, если только поле не является действительно необязательным. Скорее всего, product_title
не должно быть необязательным, как и user
, поскольку вы используете CASCADE
на случай удаления пользователя.
Note: You can limit views to a view to authenticated users with the
@login_required
decorator [Django-doc].
Note: It is normally better to make use of the
settings.AUTH_USER_MODEL
[Django-doc] to refer to the user model, than to use theUser
model [Django-doc] directly. For more information you can see the referencing theUser
model section of the documentation.
Примечание: Формы в Django пишутся в PascalCase, а не snake_case, поэтому вы можете переименовать модель из
вadd_product_info
ProductInfoForm
.
Примечание: обычно модели Django дается сингулярное имя, поэтому
Product
вместо.Products
почему вы используете ForeignKey с вашим пользователем. Первая проблема, которую я заметил, связана с классом Meta. Передайте это как список, а не кортеж.
class add_product_info(forms.ModelForm):
class Meta:
model = Products
fields = [
'product_title',
'product_image',
]
тогда попробуйте и это.
class Products(models.Model):
user = models.OneToOneField(User, related_name="merchandise_product_related_name", on_delete=models.CASCADE, blank=True, null=True)