yeralin
yeralin

Reputation: 1407

Django + ManyToMany field + Parsing JSON from fullcalendar (saves empty)

I've a problem. My form saves in views, but then in database it is all empty.

In views, I'm getting parsing JSON, and storing it in eventsParsed model, so then I can update actual from.

I know my code is a bit messy. Can you please advice me how to properly clean it too?

views.py

    args['form'] = TourCreationForm()
if request.method == 'POST':
    form = TourCreationForm(request.POST, request.FILES)
    if 'dates' in request.POST:
        eventsParsed = EventsModel()
        eventsParsed.save()
        jsonDates = request.POST['dates']
        dates = json.loads(jsonDates)
        for date in dates:
            event = CalendarEvent(title=date['title'], start=date['start'], end=date['end'], all_day=date['allDay'])
            event.save()
            eventsParsed.datesForPost.add(event)
        updated_data = request.POST.copy()
        updated_data.__setitem__('dates', eventsParsed.datesForPost)
        form = TourCreationForm(data=updated_data )
    if form.is_valid():
        form.save()

models.py

from django.db import models
from taggit.managers import TaggableManager
from django.core.validators import MinValueValidator
from decimal import *
import os.path
# Create your models here.

def image_upload_path(instance, filename):
    return os.path.join("covers/", filename)

class CalendarEvent(models.Model):
    title = models.CharField(blank=True, max_length=200)
    start = models.DateTimeField()
    end = models.DateTimeField()
    all_day = models.BooleanField(default=False)

    def __unicode__(self):
        return self.title

class EventsModel(models.Model):
    datesForPost = models.ManyToManyField(CalendarEvent)

class Tours(models.Model):
    tour = models.Manager()
    #Visible/Non-visible tour
    publish = models.BooleanField(default=False)
    username = models.CharField(max_length=200,blank=True)
    ####################



    #Head properties
    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200,unique=True,blank=True,editable=False)
    location = models.CharField(max_length=200)
    ################

    #Text Areas
    description = models.TextField()
    expect = models.TextField()
    rules = models.TextField()
    ############

    #(Un)available dates
    dates = models.ManyToManyField(CalendarEvent)

    #Price
    price = models.DecimalField(max_digits=6, decimal_places=2,default=Decimal('0.00'),validators=[MinValueValidator(Decimal('0.01'))])
    ############

    #Checks for type
    adventure_type_check = models.BooleanField(default=False)
    night_type_check = models.BooleanField(default=False)
    art_type_check = models.BooleanField(default=False)
    family_type_check = models.BooleanField(default=False)
    food_type_check = models.BooleanField(default=False)
    photography_type_check = models.BooleanField(default=False)
    shopping_type_check = models.BooleanField(default=False)
    party_type_check = models.BooleanField(default=False)
    relax_type_check = models.BooleanField(default=False)
    active_type_check = models.BooleanField(default=False)
    ######################

    #Checks for conditions
    group_check = models.BooleanField(default=False)
    risky_check = models.BooleanField(default=False)
    outside_check = models.BooleanField(default=False)
    photo_check = models.BooleanField(default=False)
    video_check = models.BooleanField(default=False)
    ######################

    #Images wide/normal
    wide_img_1 = models.ImageField(upload_to = image_upload_path, blank=True)
    wide_img_2 = models.ImageField(upload_to = image_upload_path, blank=True)
    wide_img_3 = models.ImageField(upload_to = image_upload_path, blank=True)
    normal_img_1 = models.ImageField(upload_to = image_upload_path, blank=True)
    normal_img_2 = models.ImageField(upload_to = image_upload_path, blank=True)
    normal_img_3 = models.ImageField(upload_to = image_upload_path, blank=True)
    normal_img_4 = models.ImageField(upload_to = image_upload_path, blank=True)
    ######################

    #Rest Properties of the tour
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
    tags = TaggableManager()
    ############################

    def __str__(sefl):
        return sefl.title

    class Meta:
        verbose_name = "Tour Entry"
        verbose_name_plural = "Tour Entries"
        ordering = ["-created"]

forms.py

from django import forms
from django.core.exceptions import ValidationError
from django.core.validators import MinValueValidator
from taggit.managers import TaggableManager
from tours.models import Tours
from django.utils.text import slugify
from decimal import *
import os.path

class TourCreationForm(forms.ModelForm):

    class Meta:
        model = Tours
        fields = '__all__'

Upvotes: 0

Views: 445

Answers (1)

David G
David G

Reputation: 318

You seem to be skipping the case where form.is_valid() returns false--are you sure the form you're posting is valid? Perhaps add an else and check for errors or re-display the form template (which automatically shows errors). The typical format to follow is here: https://docs.djangoproject.com/en/1.8/topics/forms/#the-view

Also, I'm not sure you want to use tour = models.Manager(). Perhaps a ForeignKey would be more appropriate. Not sure if this is the problem with the form, since you seem to have cropped some of the view code.

Upvotes: 1

Related Questions