Search code examples
pythondjangodjango-modelsdjango-formsdjango-users

Assign request.user.id to OneToOneField in Model using form


I'm using django auth for users. Every user can create one row - based on Client model. But i have problem because I cant assign in form.is_valid to field id request.user.id.

Because id is required I exclude this field in form class Meta.

Please give me some advice how i can assign user.id to my OneToOneField field.

I'm using PyCharm and when i put form. i dont see any of fields in my Model so i thing that i make some mistake in my code :(

Model:

class Client(models.Model):
    id = models.OneToOneField(User, on_delete=models.CASCADE, unique=True, primary_key=True)
    name = models.CharField(max_length=256, unique=True)
    vat = models.CharField(max_length=12, unique=True)
    address = models.CharField(max_length=64)
    zip_code = models.CharField(max_length=10, help_text='Zip Code')
    city = models.CharField(max_length=64)
    country = models.CharField(max_length=6, default='US')
    forwarding_address = models.CharField(max_length=64, blank=True)
    forwarding_zip_code = models.CharField(max_length=10, blank=True)
    forwarding_city = models.CharField(max_length=64, blank=True)
    forwarding_country = models.CharField(max_length=6, blank=True)
    phone = models.CharField(max_length=20)

    def __str__(self):
        re = self.name + ' [' + str(self.id) + ']'
        return re

Form:

class ClientProfileForm(forms.ModelForm):
    class Meta:
        model = Client
        exclude = ['id']

View:

def profile_create(request):
    if request.method == 'POST':
        form = ClientProfileForm(request.POST)
        if form.is_valid():
            form.save(commit=False)
            form.id = request.user.id
            form.save()
            return HttpResponseRedirect('/client/profile/')
        dict = {}
        dict['form'] = form
        return render(request, 'client/profile_edit.html', dict)
    else:
        if Client.objects.filter(id=request.user.id).exists():
            return HttpResponseRedirect('/client/profile/edit/')
        else:
            dict = {}
            dict['form'] = ClientProfileForm()
            return render(request, 'client/profile_edit.html', dict)

Template:

{% extends 'registration/base.html' %}
{% block title %} Client profile {% endblock %}

{% block content %}
    {{ form.non_field_errors }}
    <form role="form" action="" method="post">{% csrf_token %}

        {{ form.name.errors }}
        <div class="form-group login-input">
            <i class="fa fa-envelope overlay"></i>
            <input type="text" class="form-control text-input"
                   {% if form.name.value != nulls %} value="{{ form.name.value }}" {% endif %}
                   id="{{ form.name.name }}" name="{{ form.name.name }}">
        </div>

        {{ form.vat.errors }}
        <div class="form-group login-input">
            <i class="fa fa-envelope overlay"></i>
            <input type="text" class="form-control text-input"
                   {% if form.vat.value != nulls %} value="{{ form.vat.value }}" {% endif %}
                   id="{{ form.vat.name }}" name="{{ form.vat.name }}">
        </div>

        {{ form.address.errors }}
        <div class="form-group login-input">
            <i class="fa fa-envelope overlay"></i>
            <input type="text" class="form-control text-input"
                   {% if form.address.value != nulls %} value="{{ form.address.value }}" {% endif %}
                   id="{{ form.address.name }}" name="{{ form.address.name }}">
        </div>

        (....)

        <div class="row">
            <div class="col-sm-12">
                <button type="submit" class="btn btn-default btn-block">Create</button>
            </div>
        </div>
    </form>
{% endblock %}

Cheers!


Solution

  • That's not the right pattern. It should be:

        if form.is_valid():
            obj = form.save(commit=False)
            obj.id = request.user.id
            obj.save()