简体   繁体   中英

Save user who submitted form(django)

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>

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 }} 

try to use model.CASCADE instead of model.PROTECT .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM