Как хранить авто пользователя в базе данных?

Я создал форму для добавления товаров на сайт электронной коммерции. Форма работает не идеально.

Первый вопрос: Я хочу сохранять пользователя автоматически при отправке формы. На самом деле я хочу хранить данные о том, кто добавил продукт индивидуально.

Вторые проблемы: Поле изображения не работает, изображение не сохраняется в базе данных.

Как я могу исправить эти проблемы? Помогите мне

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 the User model [Django-doc] directly. For more information you can see the referencing the User 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)
Вернуться на верх