Hi, The problem isn't CBV's, it's probably your template.
You have the following: <form method='POST'> But it should be: <form method='POST' enctype="multipart/form-data"> Otherwise the browser doesn't know how to encode the files.... Regards, Andréas 2018-05-03 18:44 GMT+02:00 Alexander Joseph <[email protected]>: > I'm using CBVs and trying to upload a file with a FileField. It seems to > work in admin but not in my template. It doesnt give any errors when > creating the record and it saves the rest of the data in the form, but it > doesnt save the attachment > > Heres my model > > class LaserMaskDesign(models.Model): > laser_mask_design_ui = models.CharField(max_length=60, unique=True) # > Wafer Design UI > mask_layers = models.CharField(max_length=255, default='', > blank=True, null=True) > design_date = models.DateTimeField(blank=True, null=True) > designer = models.CharField(max_length=255, default='', blank=True, > null=True) > pcm = models.CharField(max_length=255, default='', blank=True, > null=True) > critical_dimensions = models.DecimalField(max_digits=20, > decimal_places=4, default=0.0000, blank=True, null=True) > dimensions = models.CharField(max_length=255, default='') > thickness = models.DecimalField(max_digits=20, decimal_places=4, > default=0.0000, blank=True, null=True) > material = models.CharField(max_length=255, default='', blank=True, > null=True) > number_of_products = models.IntegerField(default=0, blank=True, > null=True) > chip_list = models.CharField(max_length=255, default='', blank=True, > null=True) > design_document = models.FileField(blank=True, null=True) > notes = models.TextField(blank=True, null=True, default='') > created_at = models.DateTimeField(auto_now_add=True) > created_by = models.ForeignKey(settings.AUTH_USER_MODEL) > in_trash = models.BooleanField(default=False) > inactive_date = models.DateTimeField(blank=True, null=True) > > class Meta: > ordering = ['laser_mask_design_ui', ] > > def __str__(self): > return self.laser_mask_design_ui > > def get_absolute_url(self): > return reverse("engineering:laser_mask_design_detail", > kwargs={"pk": self.pk}) > > > > and my view > > class GaasWaferDesignCreateView(LoginRequiredMixin, CreateView,): > fields = ("design_ui", "emitting", "contact_location", > "optical_power", "design_date", "designer", "design_document", > "designer_ui", "in_trash", "inactive_date", "notes") > model = GaasWaferDesign > template_name = 'engineering/gaas_wafer_designs/gaas_wafer_design_ > form.html' > > def form_valid(self, form): > object = form.save(commit=False) > object.created_by = self.request.user > object.save() > return super(GaasWaferDesignCreateView, self).form_valid(form) > > > and my template > > {% extends "pages/layout.html" %} > {% load static from staticfiles %} > {% load widget_tweaks %} > {% block title %}{% if not form.instance.pk %}Add GaAs Wafer Design{% > else %}Edit GaAs Wafer Design - {{ gaaswaferdesign.design_ui }}{{ > form.instance.gaas_wafer_design.design_ui }}{% endif %}{% endblock %} > {% load django_bootstrap_breadcrumbs %} > > {% block breadcrumb %} > {% block breadcrumbs %} > {{ block.super }} > {% endblock %} > {% endblock %} > > {% block content %} > <div class="row"> > <div class="col"> > <h1 class="page_title">{% if not form.instance.pk %}Add GaAs Wafer > Design{% else %}Edit GaAs Wafer Design{% endif %}</h1> > </div> > </div> > <div class="row"> > <div class="col-md-6"> > <div class="card"> > <form method='POST'> > {% csrf_token %} > <div class="card-header"> > <strong>GaAs Wafer Design</strong> > <small>Form</small> > </div> > <div class="card-body"> > <p><strong>Bold are required *</strong></p> > {{ form.non_field_errors }} > <div class="row"> > <div class="form-group col-sm-12"> > <div class="form-group"> > <label for="{{ form.design_ui.id_for_label }}"><b>GaAs > Wafer Design UI</b></label> > {% render_field form.design_ui class+="form-control" %} > {{ form.design_ui.errors }} > </div> > </div> > </div> > <!--/.row--> > <div class="row"> > <div class="form-group col-sm-4"> > <div class="form-group"> > <label for="{{ form.emitting.id_for_label }}"><b>Emitter > Type</b></label> > {% render_field form.emitting class+="form-control" %} > {{ form.emitting.errors }} > </div> > </div> > <div class="form-group col-sm-4"> > <div class="form-group"> > <label for="{{ form.contact_location.id_for_label > }}"><b>Contact Location</b></label> > {% render_field form.contact_location > class+="form-control" %} > {{ form.contact_location.errors }} > </div> > </div> > <div class="form-group col-sm-4"> > <div class="form-group"> > <label for="{{ form.optical_power.id_for_label > }}"><b>Optical Power</b></label> > {% render_field form.optical_power class+="form-control" > %} > {{ form.optical_power.errors }} > </div> > </div> > </div> > <!--/.row--> > <div class="row"> > <div class="form-group col-sm-6"> > <div class="form-group"> > <label for="{{ form.design_date.id_for_label > }}"><b>Design Date</b></label> > {% render_field form.design_date class+="form-control" %} > {{ form.design_date.errors }} > </div> > </div> > <div class="form-group col-sm-6"> > <div class="form-group"> > <label for="{{ form.designer.id_for_label > }}"><b>Designer</b></label> > {% render_field form.designer class+="form-control" %} > {{ form.owner.errors }} > </div> > </div> > </div> > <!--/.row--> > <div class="row"> > <div class="form-group col-sm-6"> > <div class="form-group"> > <label for="{{ form.designer_ui.id_for_label > }}">Designer UI</label> > {% render_field form.designer_ui class+="form-control" %} > {{ form.designer_ui.errors }} > </div> > </div> > <div class="form-group col-sm-6"> > <div class="form-group"> > <label for="{{ form.design_document.id_for_label > }}">Design Document</label> > {% render_field form.design_document > class+="form-control" %} > {{ form.design_document.errors }} > </div> > </div> > </div> > <!--/.row--> > <div class="row"> > <div class="form-group col-sm-6 text-left"> > <div class="form-group" style="float:left;"> > <label for="{{ form.in_trash.id_for_label }}">In > Trash?</label> > {% render_field form.in_trash class+="form-control" %} > {{ form.in_trash.errors }} > </div> > </div> > <div class="form-group col-sm-6"> > <div class="form-group"> > <label for="{{ form.inactive_date.id_for_label }}">Date > Trashed</label> > {% render_field form.inactive_date class+="form-control" > %} > {{ form.inactive_date.errors }} > </div> > </div> > </div> > <!--/.row--> > <div class="row"> > <div class="form-group col-sm-12"> > <div class="form-group"> > <label for="{{ form.comments.id_for_label > }}">Notes</label> > {% render_field form.notes class+="form-control" %} > {{ form.notes.errors }} > </div> > </div> > </div> > <!--/.row--> > </div> > <div class="card-footer"> > <input type="submit" class="btn btn-primary" value="Save"> > </div> > </form> > </div> > </div> > </div> > {% endblock %} > > > Thanks! > > -- > You received this message because you are subscribed to the Google Groups > "Django users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at https://groups.google.com/group/django-users. > To view this discussion on the web visit https://groups.google.com/d/ > msgid/django-users/981c16a8-29e6-46e1-b539-7511c50b8849%40googlegroups.com > <https://groups.google.com/d/msgid/django-users/981c16a8-29e6-46e1-b539-7511c50b8849%40googlegroups.com?utm_medium=email&utm_source=footer> > . > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/django-users. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CAK4qSCdCunO-Zw%3DjN-0pSijLjLM2O39RHxiVZapO8da3PPLkBQ%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.

