Не удается сохранить изображение без ошибки в форме модели django - PullRequest
0 голосов
/ 12 января 2020

Я хочу попытаться сохранить изображение в моей модели:

def user_directory_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
    return 'user_{0}/{1}'.format(instance.user.id, filename)
class Leverandor(models.Model):
    ID = models.AutoField(primary_key=True)
    UserID = models.ForeignKey('Stamdata', on_delete=models.CASCADE)
    Name = models.CharField('Name', max_length=200)
    URL = models.URLField('URL', max_length=200)
    ImageURL = models.ImageField('ImageURL',blank=True, null=True, upload_to=user_directory_path)

К этой форме.py:

class EditLeverandorForm(forms.ModelForm):
    Name = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control', 'autofocus': True}))
    URL = forms.URLField(widget=forms.TextInput(attrs={'class': 'form-control', 'autofocus': True}))
    ImageURL = forms.ImageField
    class Meta:
        model = Leverandor
        labels = {
            'Name' : 'Leverandør',
            'URL' : 'Webside',
            'ImageURL' : 'Logo',
            }
        fields = ['UserID', 'Name', 'URL', 'ImageURL']

И отобразить это представление.py

def add_leverandorer(request):
    user_id = request.user.id
    # if this is a POST request we need to process the form data
    if request.method == 'POST':
        print (user_id)
        form = EditLeverandorForm(request.POST, request.FILES, instance=request.user)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/backend/leverandorer')
                
    else:
        print ('somethin goes wrong')
        print (user_id)
        form = EditLeverandorForm()
    return render(
        request,
        'backend/add_leverandorer.html', 
        {
            'title':'WestcoastShop - Backend',
            'form':  form,
        }
    )

Проблема в том, что перед добавлением части instance = request.user запись сохраняется правильно, но без изображения. Теперь я добавляю деталь из Django документации, как это предусмотрено для сохранения в переменную, но ничего не произошло после нажатия кнопки сохранения.

<form action="/backend/leverandorer/add" method="post" enctype="multipart/form-data">
                                    {% csrf_token %}
                                    <div class="form-group">
                                        <label for="simpleinput">Leverandør</label>
                                        {{ form.Name }}
                                    </div>

                                    <div class="form-group">
                                        <label for="simpleinput">Webside</label>
                                        {{ form.URL }}
                                    </div>
                                    <div class="form-group">
                                        <label for="simpleinput">Logo</label>
                                        {{ form.ImageURL }}
                                        <!--<input type="file" name="ImageURL" accept="image/*" required="" id="id_ImageURL" class="form-control-file">-->
                                    </div>
                                    <input type="hidden" id="UserID" name="UserID" value="{{ user.id }}">
                                    <button type="submit" class="btn btn-primary">Gem</button>
                                </form>

Я не увидел ошибку, но теперь она не сохраняет форму в моделях, даже если ImageField пуст.

касается Кристофера.

Ответы [ 2 ]

0 голосов
/ 12 января 2020

II изменить функцию в models.py на:

def user_directory_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
    return 'user_{0}/{1}'.format(instance.UserID, filename)
class Leverandor(models.Model):
    ID = models.AutoField(primary_key=True)
    UserID = models.ForeignKey('Stamdata', on_delete=models.CASCADE)
    Name = models.CharField('Name', max_length=200)
    URL = models.URLField('URL', max_length=200)
    ImageURL = models.ImageField('ImageURL',blank=True, null=True, upload_to=user_directory_path)

работает, но путь это Имя пользователя, а не user.id

0 голосов
/ 12 января 2020

Вы используете UserID в качестве скрытого поля. Скрытое поле не пройдет проверку формы. Поэтому ваш следующий код будет ложным.

    if form.is_valid():
        form.save()
        return HttpResponseRedirect('/backend/leverandorer')

Одним из решений является удаление поля UserID из шаблона и обновление представления следующим образом.

  if form.is_valid():
     user_form = form.save(commit=False)
     user_form.UserID = request.user
     user_form.save()
...