0

So I'm creating a reporting app for my organization I want to be able to save the user that submits the report. Problem is if I use the models.ForeignKey(User,on_delete=models.PROTECT) method on my model I get a drop down for all the users which is not what I want.

models.py

class Report(models.Model):
    id = models.UUIDField(primary_key=True,default=uuid.uuid1,editable=False)
    department = models.ForeignKey(Company,null=True,on_delete=models.SET_NULL)
    user= models.ForeignKey(User,on_delete=models.PROTECT)
    submission_date= models.DateField(auto_now=True) #invisible to user
    submission_time = models.TimeField(auto_now=True) #invisible to ,user
    date = models.DateField(default=now,blank=False)
    time = models.TimeField(default=now,blank=False,help_text="hh:mm:ss")
    location = PlainLocationField()
    building = models.ForeignKey(bld,null=True,on_delete=models.SET_NULL)
    size = models.PositiveIntegerField()
    notes = models.TextField(blank=True)
    def __str__(self):
        return f'{self.date} {self.time} ({self.company})

form.py

from django.forms import ModelForm, fields
from django.shortcuts import redirect
from django.urls.conf import include
from .models import Report
from django import forms
from location_field.forms.plain import PlainLocationField

class ReportForm(forms.ModelForm):
    class Meta:
        model = Report
        fields = '__all__'
        location = PlainLocationField()
    def redirect():
        return redirect("Report")

views.py

from django.forms import fields
from django.forms.forms import Form
from django.http import request
from django.http.request import HttpRequest, validate_host
from django.http.response import HttpResponse, HttpResponseRedirect
from django.shortcuts import render,redirect
from django.urls.base import reverse
from django.views.generic.base import TemplateView
from django.contrib.auth import authenticate, login
from django.contrib.auth.mixins import LoginRequiredMixin
# Create your views here.
from .forms import ReportForm
from .models import Report
from django.views.generic.edit import CreateView, UpdateView, DeleteView

class ReportCreate(LoginRequiredMixin,CreateView):
    Template = "templates\reports\report.html"
    model = Report
    fields = '__all__'
    def form_valid(self, form):
        return super().form_valid(form)
    def get_success_url(self):
        return reverse('Report')
def home(request):
    return render(request,"users/home.html")

EDIT: templates/report_form.html

    {% extends "base_generic.html" %}
    <head>
    </head>
    <body>
    {% block content %}
      <form action="" method="post" onsubmit="return True">
        {% csrf_token %}
        <table>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<input type="hidden" name="user" value= "{{ request.user }}">
        {{ form.as_table }}
        {{ form.media }}
        </table>
        <input type="submit" value="Submit">
      </form>
    {% endblock %}
    </body>
owescott
  • 7
  • 2

1 Answers1

0

There's a few of ways to go about this.

You can add blank=True to user model field and assign the user when overriding the form_valid method:

def form_valid(self, form):
        form.instance.user = self.request.user
        form.instance.save()
        return super(ReportCreate, self).form_valid(form)

Or, render the user form field as a hidden field and pre-populate it:

<input type="hidden" name="user" value="{{ request.user }} 
ADK
  • 144
  • 3
  • 8
  • Neither of those methods appear to work the User field still shows on the reports page with a drop down. I even set the user field to be excluded in my forms.py – owescott Jan 31 '22 at 20:40
  • Can you add the template file to your question? – ADK Jan 31 '22 at 20:45
  • Ah just checked it seems to show the user who submitted the report correctly in the admin page – owescott Jan 31 '22 at 20:49
  • If you replaced `fields = '__all__'` with `exclude = ['user']`, the user field dropdown should no longer appear when you render `{{ form.as_table }}`. – ADK Jan 31 '22 at 21:08
  • yeah for some reason after I do that it's still showing up – owescott Jan 31 '22 at 21:51