Обновите models.py из моих представлений после проверки, существуют ли какие-либо данные - PullRequest
1 голос
/ 14 июля 2020

Я хотел бы заполнить два столбца в моей базе данных после проверки наличия каких-либо данных. Была создана страница html для проверки значения 'epass', и если она существует, она должна отредактировать модели, чтобы добавить «main_status», «main_dt».

ftForm. html

<form action="{% url 'ft_new' %}" method="POST" enctype="multipart/form-data" style="width:70%;margin:0 auto;">
    {% csrf_token %}
     <div class="form-row">
            <div class="col">
                <label for="epass">E-PASS</label>
                <input id="epass" class="form-control" type="text" name="epass" value="">
            </div>
     </div>
    {% if messages %}
            <ul class="messages">
                {% for message in messages %}
                    <li class="{{ message.tags }}" style="color:red">{{ message }}</li>
                {% endfor %}
            </ul>
    {% endif %}
    <button type="submit" class="btn btn-info my-4 btn-block">Salvar</button>
</form>

views.py

def ft_new(request):
    form = EPASSForm(request.POST or None)

    if form.is_valid():
        post = form.save(commit=False)
        epassForm = request.POST.get('epass')

        if FtMain.objects.filter(epass=epassForm):
            all = FtMain.objects.filter(epass=epassForm)
            post.epass = all.get('epass')
            post.insp_ymd = all.get('insp_ymd')
            post.line_nm = all.get('line_nm')
            post.model_code = all.get('model_code')
            post.pba_status = all.get('pba_status')
            post.pba_dt = all.get('pba_dt')
            post.main_status = 'Y'
            post.main_dt = datetime.now()
            post.bcr = all.get('bcr')
            form.save()
            messages.success(request, 'Salved with success')
            return redirect('ft_new')
        else:
            messages.error(request, 'There is no insppection')
    else:
        return HttpResponse('Page Error')
    return render(request,'control/ftForm.html',{'form':form})

models.py

class FtMain(models.Model):
    insp_ymd = models.DateField(blank=True, null=True)
    line_nm = models.CharField(max_length=20, blank=True, null=True)
    model_code = models.CharField(max_length=20, blank=True, null=True)
    epass = models.CharField(max_length=25, blank=True, null=True)
    pba_status = models.CharField(max_length=20, blank=True, null=True)
    pba_dt = models.DateTimeField(blank=True, null=True)
    main_status = models.CharField(max_length=20, blank=True, null=True)
    main_dt = models.DateTimeField(blank=True, null=True)
    bcr = models.CharField(max_length=20, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'ft_main'

forms.py

class EPASSForm(ModelForm):
    class Meta:
        model = FtMain
        fields = ['insp_ymd','line_nm','model_code','pba_status','pba_dt','main_status','main_dt','bcr']

в результате произошла следующая ошибка: слишком много значений распаковать (ожидается 2)

введите описание изображения здесь

1 Ответ

1 голос
/ 14 июля 2020

Вы можете получить объект с помощью вызова .get(…) [Django -doc] . Это вызовет исключение FtMain.DoesNotExist в случае, если такого элемента не существует:

def ft_new(request):
    if request.method == 'POST':
        form = EPASSForm(request.POST, request.FILES)
        if form.is_valid():
            try:
                obj = FtMain.objects.get(epass=epassForm)
                form.instance.epass = obj.epass
                form.instance.insp_ymd = obj.insp_ymd
                form.instance.line_nm = obj.line_nm
                form.instance.model_code = obj.model_code
                form.instance.pba_status = obj.pba_status
                form.instance.pba_dt = obj.pba_dt
                form.instance.main_status = 'Y'
                form.instance.main_dt = datetime.now()
                form.instance.bcr = obj.bcr
                form.save()
                messages.success(request, 'Salved with success')
                return redirect('ft_new')
            except FtMain.DoesNotExist:
                messages.error(request, 'There is no insppection')
                return HttpResponse('Page Error')
    else:
        form = EPASSForm(request.POST)
    return render(request,'control/ftForm.html',{'form':form})

Это его, однако, бит нечетное для копирования большого количества информации. Обычно используется ForeignKey [Django -doc] to ссылка на объект, который имеет данные.

...