Хранение формы отправленного изображения в django ImageField в определенной папке - PullRequest
0 голосов
/ 07 июня 2018

У меня есть форма модели Django.Одним из полей в форме является ImageField с заданным путем к определенной папке для хранения изображений.Я хочу получить изображение, которое отправлено с формой и именем изображения.Я хочу, чтобы само изображение сохранялось в папке, а имя сохранялось в базе данных, чтобы иметь возможность получать его, когда мне это нужно.Я огляделся по сторонам и не нашёл подходящих ответов для решения этой проблемы.Вот мой код:

Models.py:

    user = models.ForeignKey(User, on_delete=models.CASCADE)
    profile_pic = models.ImageField(upload_to='static/images/profile_pics/', height_field=500, width_field=500, max_length=100)
    bio = models.TextField()

views.py:

        if request.method == "POST":
        form = ProfileForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            first_name = cd['first_name']
            last_name = cd['last_name']
            profile_pic = cd['profile_pic']
            bio = cd['bio']
            new_profile = Profile.objects.create(
                first_name = first_name,
                last_name = last_name,
                bio = bio,
                profile_pic = profile_pic,
                dob = dob,
            )

это то, что отправляется в запросе:

enter image description here

Вот прямой путь, по которому я хочу сохранить изображения.

enter image description here


ОБНОВЛЕНИЕ:

вот модель models.py:

class Profile(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    profile_pic = models.ImageField(upload_to='images/profile_pics/', max_length=100)
    bio = models.TextField()
    dob = models.DateField(auto_now=False, auto_now_add=False)
    phone = models.IntegerField()
    gender = models.CharField(max_length=11)
    company = models.CharField(max_length=22)
    occupation = models.CharField(max_length=22)
    street = models.CharField(max_length=44)
    city = models.CharField(max_length=22)
    state = models.CharField(max_length=4)
    zip_code = models.IntegerField()
    group = models.CharField(max_length=22)
    premium = models.BooleanField(default=False)
    active = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)

Вот файл forms.py:

class ProfileForm(forms.ModelForm):
    first_name = forms.CharField(max_length=22,
        label="First Name")
    last_name = forms.CharField(max_length=22,
        label="Last Name")
    dob = forms.DateField(
        label='Date of Birth',
        widget=forms.widgets.DateInput(attrs={'type':'date'})
    )
    gender_choices = (('M', 'Male'),
                      ('F', 'Female'),
                      ('O', 'Other'))
    gender = forms.TypedChoiceField(
        choices = gender_choices,
        label='Gender')
    class Meta:
        model = Profile
        fields = ['first_name', 'last_name', 'profile_pic', 'bio', 'dob', 'company',
                  'occupation', 'gender', 'phone', 'street', 'city', 'state', 'zip_code']

Вотшаблон:

Профиль:

<form method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" name="complete" value="complete">
</form>

1 Ответ

0 голосов
/ 07 июня 2018

Параметр upload_to относится к относительному пути внутри папки «media», он не относится к корневому пути.Чтобы это работало, сначала вам нужно указать медиа-корень в файле settings.py, а затем путь ниже скажет django поместить все загруженные изображения в /media/images/profile_pics/.

upload_to Ссылка

profile_pic = models.ImageField(upload_to='images/profile_pics/', height_field=500, width_field=500, max_length=100)

Для того, чтобы форма сохраняла изображения, вы также должны предоставить форму вместе с файлами.

# this way the form have access to the file uploaded in the buffer
form = ProfileForm(request.POST, request.FILES)    
...