Vic Nicethemer
Vic Nicethemer

Reputation: 1111

Django: How to save objects with ManytomayField in Form

I have a form, after submitting i want to save it to database. I have created a model for this. All good if I save simple fields, CharField and so on. But model have many-to-many fileld and can add tis fields specifying primary key, i.e. 1 or 2. But how to insert data, that is not in db already?

form in views.py:

def vk_get_wallposts(request):
sys_project_name = ''
internet_source_type = ''  #
success = False
number_to_get = ''
group_url = ''
forum_urls = ''
date_saved = datetime(2015, 9, 26)
filter_posts = ''
print('vk_get_wallposts form')

if request.method == 'POST':
    vkwallpostget_form = VkwallpostgetForm(request.POST)
    if vkwallpostget_form.is_valid():
        print('vk_get_wallposts form is_valid')
        success = True
        sys_project_name = vkwallpostget_form.cleaned_data[
            'sys_project_name']
        internet_source_type = vkwallpostget_form.cleaned_data[
            'internet_source_type']
        number_to_get = vkwallpostget_form.cleaned_data['number_to_get']
        # domain = vkwallpostget_form.cleaned_data['domain']
        group_url = vkwallpostget_form.cleaned_data['group_url']
        forum_urls = vkwallpostget_form.cleaned_data['forum_urls']
        filter_posts = vkwallpostget_form.cleaned_data['filter_posts']

        if 'Vk.com' in internet_source_type:
            get_wallposts_by_owner_id(group_url, sys_project_name, date_saved, number_to_get,
                                      filter_posts=filter_posts)  # 81099158  @staticmethod из класса VkuserListView

        pr = Userproject.objects.create(name=sys_project_name, description='test description', user=request.user, date_updated=date_saved,
                                  date_until=date_saved)
        pr.vk_groups.add(1,2)
        #pr.vk_groups.add('https://vk.com/southitpark', 'https://vk.com/graphgrail') - this is dont work

else:
    vkwallpostget_form = VkwallpostgetForm()
    success = False

ctx = {'vkwallpostget_form': vkwallpostget_form, 'sys_project_name': sys_project_name,
       'internet_source_type': internet_source_type, 'forum_urls': forum_urls,
       'group_url': group_url, 'number_to_get': number_to_get, 'filter_posts': filter_posts, 'success': success}
return render_to_response('vk_get_wallposts.html', ctx, context_instance=RequestContext(request))

So lines works: pr = Userproject.objects.create(name=sys_project_name, description='test description', user=request.user, date_updated=date_saved, date_until=date_saved) pr.vk_groups.add(1,2)

But I need dynamically insert data to many-to-many field, this data is list of strings, so pr.vk_groups.add('https://vk.com/south', 'https://vk.com/graph') - this is dont work

Upvotes: 0

Views: 56

Answers (2)

Vic Nicethemer
Vic Nicethemer

Reputation: 1111

With this code i was able to solve:

        url1 = Vkgroupstomonitor(vk_group_name="https://vk.com/south3")
        url1.save()
        url2 = Vkgroupstomonitor(vk_group_name="https://vk.com/graph3")
        url2.save()
        project = Userproject(name=sys_project_name, description='test description', user=request.user, date_updated=date_saved,
                                  date_until=date_saved)
        project.save()
        project.vk_groups.add(url1,url2)

Also I prefer to rewrite this with for cycle, without saving one by one

Upvotes: 0

bixente57
bixente57

Reputation: 1348

I'm guessing that your model should be something like:

class VKGroup(Model):
  vk_url = ManyToManyField(VKURL, ...)
class VKURL(Model):
  url = CharField / or URLField

Then, if you use a view (as mentionned), you simply do like:

url1 = VKURL(url="https://vk.com/south")
url1.save()
url2 = VKURL(url="https://vk.com/graph")
url2.save()
VKGroup = VKgroup(...)
VKGroup.add(url1,url2)

That's it!

NB. If you deal with a Form, see this, there is a special Form.save_m2m() method when handling form data. Personally I try to avoid this and deal directly in the view.

Upvotes: 1

Related Questions