yamachan
yamachan

Reputation: 1079

Doesn't OneToOneField of Django refer another table's id field?

I thought models.OneToOneField, in this case group field, refers Group table's id field. But, through my views.py, that Group's id == 6 but Group_Cover's group_id == 3 happens if I don't upload image when Group's id == 2, 3 and 4.

Sorry, my English is strange. In short, I thought Django set 6 in Group_Cover's group_id when Group's id is 6.

models.py

@python_2_unicode_compatible
class Group(models.Model):

    #group_id = models.AutoField(primary_key=True)
    group_name = models.CharField(max_length=50, unique=False, blank=False)

    class Meta:
        db_table = traceback.extract_stack()[-2][2].lower()


@python_2_unicode_compatible
class Group_Cover(models.Model):

    group = models.OneToOneField(Group, primary_key=True)
    group_cover = models.ImageField(upload_to="static/image/group/")

    class Meta:
        db_table = traceback.extract_stack()[-2][2].lower()

views.py

@login_required(login_url='/')
def group_register(request):

    import pdb; pdb.set_trace()
    from myapp.forms import GroupRegister
    from myapp.forms import GroupCover
    formset = GroupRegister
    formcover = GroupCover

    if request.method == 'POST':
        form = formset(request.POST)
        cover = formcover(request.POST)

        if form.is_valid():
            from myapp.models import Group
            new_group = Group()
            new_group.group_name = form.cleaned_data['group_name']
            new_group.save()

            from myapp.models import Group_Cover
            new_cover = Group_Cover()
            new_cover.group_cover = request.FILES['group_cover']
            new_cover.save()

            return redirect('/myapp/group_page/{}'.format(new_group.id))

    else:
        form = formset()
        cover = formcover()

    view = { 
        'form': form,
        'cover': cover,
    }
    template = 'myapp/group/group_register.html'
    return render(request, template, view)

Upvotes: 3

Views: 259

Answers (3)

C14L
C14L

Reputation: 12558

new_cover = Group_Cover(group=new_group)
new_cover.group_cover = request.FILES['group_cover']
new_cover.save()

Need to tell Django what group you are refering to (see group=new_group)

Upvotes: 2

Sudip Kafle
Sudip Kafle

Reputation: 4391

You have not specified the group while initializing Group_Cover.

Instead of following code:

new_cover = Group_Cover()

Use the following:

new_cover = Group_Cover(group=new_group)

Upvotes: 2

Vladir Parrado Cruz
Vladir Parrado Cruz

Reputation: 2359

You need to assign the Group instance to the Group_Cover one. More or less so:

   if form.is_valid():
        from myapp.models import Group
        new_group = Group()
        new_group.group_name = form.cleaned_data['group_name']
        new_group.save()

        from myapp.models import Group_Cover
        new_cover = Group_Cover()
        new_cover.group_cover = request.FILES['group_cover']

        new_cover.group = new_group # This line assigns it

        new_cover.save()

Upvotes: 4

Related Questions