首页 > 解决方案 > 在Django中使用模型FileField上传文件时如何获取实例

问题描述

我是 Django 新手...我有一个模型 FileField 来上传文档,我希望文件路径根据客户端 ID。

像这样: 在此处输入图像描述

我有一个客户模型,我有一个上传模型,链接到客户:

模型.py

class BasicUploadTo():
    prefix = ''
    suffix = dt.now().strftime("%Y%m%d%H%M%S")

    def upload_rules(self, instance, filename):
        (filename, extension) = os.path.splitext(filename)
        id = instance.customer_id.customer_id.user_id
        return os.path.join(str(id), "Docs", f"{self.prefix}_{self.suffix}{extension}")

    def upload_br(self, instance, filename):
        instance1 = Customer.customer_id
        self.prefix = "BR"
        dir = self.upload_rules(instance, filename)
        return dir

class AttachmentsBasic(models.Model):
    customer_id = models.OneToOneField("Customer", verbose_name="client ID", on_delete=models.DO_NOTHING, blank=False, null=True)
    br = models.FileField(upload_to=BasicUploadTo().upload_br, verbose_name="BR", null=True, blank=True)

class Customer(models.Model):
    customer_id = models.OneToOneField("UserID", blank=False, null=True, verbose_name="Client ID", on_delete=DO_NOTHING)
    ...

class UserID(models.Model):

    user_id = models.CharField(max_length=5, blank=False, verbose_name="Client ID")

    class Meta():
        verbose_name = "Client"
        verbose_name_plural = "Client"

    def __str__(self):
        return f"{self.user_id}"

表格.py:

class ClientUploadForm(ModelForm):
class Meta:
    model = AttachmentsBasic
    fields = ( "br",)

def __init__(self, path, *args, **kwargs):
    super(ClientUploadForm, self).__init__(*args, **kwargs)
    print(path)
    for x in self.fields:
        self.fields[x].required = False

def save(self, client_id, commit=True):
    
    clientDoc = super(ClientUploadForm, self).save(commit=True)
    print(self)

    instance = Customer.objects.get(customer_id__user_id=client_id)
    clientDoc.customer_id = instance

    if commit:
        clientDoc.save()
    return clientDoc

视图.py

def clienInfo(request, client):
clientsIDs = [c.customer_id.user_id for c in Customer.objects.all()]

if client in clientsIDs:
    matching_client = Customer.objects.filter(customer_id__user_id=client)

    if request.method == "POST":
        instance = Customer.objects.get(customer_id__user_id=client)
        uploadForm = ClientUploadForm(request.POST, request.FILES, instance.customer_id.user_id)
        if uploadForm.is_valid():
            uploadForm.save(request.POST["customer_id"])
        else:
            print("Client's document form got error.")
    else:
        print("Client form got error.")
    uploadForm = ClientUploadForm
    sale = sales.objects.all()
    return render(request=request,
                template_name="home/client-info-test.html",
                context={"clientInfo": matching_client,
                        "uploadForm": uploadForm,
                        "sales": sale})

但是当我通过我的网站上传文件时我什么也没有,但我可以通过 Django 管理页面上传文件

<input type="file" class="" name="br">

错误:在此处输入图像描述

有人可以帮助我...非常感谢!!!!!!!

标签: djangodjango-modelsfile-uploaddjango-forms

解决方案


我已经解决了这个问题,只需使用前端站点中的 {{form.br}},使用视图中的原始表单。视图.py

def updateClienInfo(request, client_id):

    clientDoc = AttachmentsBasic.objects.get(customer_id__customer_id__user_id=client_id)
    docForm = ClientUploadForm(instance=clientDoc)

    if request.method == "POST":
     docForm = ClientUploadForm(request.POST or None,
                           request.FILES or None,
                           instance=clientDoc)
        if docForm.is_valid():
            docForm.save()
            return HttpResponseRedirect('/')
        else:
            print(docForm.errors)
            print("Upload document form got errors.")
    else:
        print("Client's saving form got error.")

    return render(request=request,
            template_name="home/client-info-test1.html",
            context={"docForm" : docForm,
                    })

主页/客户端信息-test1.html

<div class="card-body">
  <label class="card-text">BR</label>
    {{docForm.br}}
</div>

表格.py

class ClientUpdateForm(ModelForm):
    class Meta:
        model = Customer
        fields = ("company_name", ...) #your model field name
    
    def __init__(self, *args, **kwargs):
        super(ClientUpdateForm, self).__init__(*args, **kwargs)
        for visible in self.visible_fields():
            visible.field.widget.attrs['class'] = 'form-control'

        for x in self.fields:
            self.fields[x].required = False

推荐阅读