-1

what I am trying to accomplish is to send the "requester" model, using the logged-in user to a form ...

Mainly the problem that I have is that the views.py "class CreateOrderView(CreateView)" does not have a parameter "request" , so I cannot get the request.user, and therefore get requester_obj and automatically select this requester_obj in the form field "requester", when entering this page.

models.py Order:

    DEFAULT_REQUESTER_ID= 1
    requester = models.ForeignKey(Profile, on_delete=models.CASCADE, default=DEFAULT_REQUESTER_ID, verbose_name="usuario")

forms.py:

class OrderCreateForm(BaseForm, forms.ModelForm):
date = forms.DateField(label="Fecha" , widget=forms.DateInput(attrs={'type': 'date'}))

class Meta:
    model = Order
    fields = ['requester','title' , 'date', ]

views.py:

@method_decorator(staff_member_required, name='dispatch')
class CreateOrderView(CreateView):
    template_name = 'form.html'
    form_class = OrderCreateForm
    model = Order

    def get_success_url(self):
        self.new_object.refresh_from_db()
        return reverse('update_order', kwargs={'pk': self.new_object.id})

    def form_valid(self, form):
        object = form.save()
        object.refresh_from_db()
        self.new_object = object
        return super().form_valid(form)

I get the requester like this:

@login_required
def create(request):
    #return render(request, 'app_client/create.html')
    if request.method == 'POST':
        if request.POST['value'] and request.POST['products']:
            logged_user = request.user
            user_obj = get_object_or_404(User, username=logged_user)
            requestor_obj = get_object_or_404(Profile, user=user_obj)

....

Tom Carrick
  • 6,349
  • 13
  • 54
  • 78
Jesus Fung
  • 76
  • 8
  • 1
    Are you trying to migrate from a function-based view to a class-based view? – Lewis Jun 19 '20 at 20:46
  • Kind of. What I am trying is to auto-select the form field "requester", and that implies to get the current logged-in user (request.user), or find another way to get request.user in a class-based view and send it to the form field – Jesus Fung Jun 19 '20 at 21:01
  • Could you possibly just use self.request.user within the is_valid method? – Lewis Jun 20 '20 at 07:57

1 Answers1

0

I just found a solution for my issue...

What I did was to remove the "requester" field in forms.py, and send the requester obj to the form after user presses the submit form button

def form_valid(self, form):
    logged_user = self.request.user
    user_obj = get_object_or_404(User, username=logged_user)
    requester_obj = get_object_or_404(Profile, user=user_obj)

    form.instance.requestor = requestor_obj

    object = form.save()
    object.refresh_from_db()
    self.new_object = object
    return super().form_valid(form)

form.instance.requestor = requestor_obj was the line that I needed to send it to form before saving it.

ref: Django CreateView Foreign key

Jesus Fung
  • 76
  • 8