2

i am really exhausted i didn't find any solution for this till now. I was trying to create a table to view all the data save by the user. The problem is that all the inputs in the models.py are saved excluding the parameters with checkbox. I don't know what is the problem. All these parameters in models.py are saved in the database.

This is my Models.py :

class Parameters(models.Model):

user        = models.ForeignKey(User)
title       = models.CharField('title', max_length=100, default='', blank=True, help_text='Use an indicative name, related to the chosen parameters')
type = models.CharField('forecast type', choices=FORECAST_TYPES, max_length=20, default="backtest")

#input characteristics
price_1_min             = models.FloatField('1. Price, min', default=0.1, validators=[MinValueValidator(0.1), MaxValueValidator(20000)])
price_1_max             = models.FloatField('1. Price, max', default=20000, validators=[MinValueValidator(0.1), MaxValueValidator(20000)])
stocks_num_2_min            = models.IntegerField('2. Number of selected stock, min', default=3, validators=[MinValueValidator(0), MaxValueValidator(100)])
stocks_num_2_max            = models.IntegerField('2. Number of selected stock, max', default=7, validators=[MinValueValidator(1),])
limit_3                 = models.FloatField('3. Last price to upper straight, %', default=20, validators=[MinValueValidator(-200),])
learning_days_4_min         = models.IntegerField('4. Number of Learning days, min', default=1, validators=[MinValueValidator(1),MaxValueValidator(30)])
learning_days_4_max         = models.IntegerField('4. Number of Learning days, max', default=10, validators=[MinValueValidator(1),MaxValueValidator(30)])
evaluation_days_5           = models.IntegerField('5. Number of Evaluation days', default=10, validators=[MinValueValidator(1),MaxValueValidator(10)])
delay_days_6                = models.IntegerField('6. Number of “no quarterly reports” days (N)', default=10, validators=[MinValueValidator(0),MaxValueValidator(20)])
minimum_gain_7              = models.FloatField('7. Minimum gains for winners', default=0, validators=[MinValueValidator(0),MaxValueValidator(100)])
minimum_loss_8              = models.FloatField('8. Minimum losses for losers', default=0, validators=[MinValueValidator(-100),MaxValueValidator(0)])
total_gain_min_9            = models.FloatField('9. Minimum total gain', default=0, validators=[MinValueValidator(0),MaxValueValidator(100)])
winning_stock_percentage_min_10     = models.FloatField('10. Minimum percentage of winning stocks', default=60, validators=[MinValueValidator(0),MaxValueValidator(100)])


#input characteristics
period_start        = models.DateField('period, start', default=datetime.date(2013, 9, 25)) 
period_end      = models.DateField('end', default=datetime.datetime.today().date() - datetime.timedelta(days=16))
inital_capital      = models.IntegerField('Total initial capital, USD', default=100000, validators=[MinValueValidator(10000),])
fraction_to_invest  = models.FloatField('Percentage of the available capital to (re)invest', default=50, validators=[MinValueValidator(10), MaxValueValidator(90)])
minimum_cash        = models.IntegerField('Minimum cash to invest, %', default=5, validators=[MinValueValidator(1), MaxValueValidator(50)])
trades_fees         = models.FloatField('Trade fees, USD', default=8, validators=[MinValueValidator(0),])
stop_loss       = models.FloatField('Stop-Loss, %', default=-2, validators=[MinValueValidator(-50), MaxValueValidator(-1)])
target_gain     = models.FloatField('Target gain, %', default=5, validators=[MinValueValidator(1),])

created_at  = models.DateTimeField(u'created', auto_now_add=True)
updated_at  = models.DateTimeField(u'updated', auto_now=True)

This is the forms.py: All the inputs with multiplechoice field are empty after save

class BacktestForm(forms.ModelForm):

period_start = forms.DateField(initial=datetime.datetime.today().date() - datetime.timedelta(days=365+16), widget=forms.widgets.DateInput(format="%Y/%m/%d"), input_formats=["%Y/%m/%d"])
period_end  = forms.DateField(initial=datetime.datetime.today().date() - datetime.timedelta(days=16), widget=forms.widgets.DateInput(format="%Y/%m/%d"), input_formats=["%Y/%m/%d"])

    market = forms.MultipleChoiceField(required=False,widget=CheckboxSelectMultiple, choices=MARKET_CHOICES)
    sector = forms.MultipleChoiceField(required=False,widget=CheckboxSelectMultiple, choices= MEDIA_CHOICES)
class Meta:
    model = Parameters
    exclude = [
        'user',
        'type',
        'created_at', 
        'updated_at', 
        ]
    widgets={
        'title': forms.TextInput(attrs={'placeholder':'for ex. highLimitLowPrice'}),
        }

The function of save in view.py:

def backtest(request, pk=None):

if pk is not None:
    param = get_object_or_404(Parameters, pk=pk, user=request.user)
    form = BacktestForm(request.POST or None, instance=param)
else:
    form = BacktestForm(request.POST or None)

    if request.method == 'POST':
    if form.is_valid():
        if 'save' in request.POST:
            obj = form.save(commit= False)


            obj.user = request.user
            obj.type = "backtest"

            obj.save()
            messages.info(request, 'Saved!')
            return redirect(obj.get_backtest_url())

                    else:
                            messages.info(request, 'Please check entered data')
                data = {
            'active_page': 'backtest',
            'form': form,}
faro
  • 89
  • 7

1 Answers1

0

In models.py

class Parameters(models.Model):
    ...
    MARKET = (
    (1,'First'),
    (2,'Second')
    )
    SECTOR= (
    (1,'First'),
    (2,'Second')
    )
    market = models.CharField('Market', max_length=30, null=True)
    sector= models.CharField('Sector', max_length=30, null=True)

    def display_sector_label(self)
        sectors= [(str(dict(self.SECTOR)[value])) for value in self.sector]
        return ", ".join(sectors)

    def display_market_label(self)
        markets = [(str(dict(self.MARKET)[value])) for value in self.market]
        return ", ".join(markets)

In forms.py

class BacktestForm(forms.ModelForm):
    market = forms.MultipleChoiceField(
        label='Market',
        choices=Parameters.MARKET,
        widget=forms.CheckboxSelectMultiple
    )
    sector = forms.MultipleChoiceField(
        label='Sector',
        choices=Parameters.SECTOR,
        widget=forms.CheckboxSelectMultiple
    )
Neeraj Kumar
  • 3,851
  • 2
  • 19
  • 41
  • Thank youuuu .. you save me. From the morning I am trying to find the solution. – faro May 31 '17 at 21:35
  • if my variable are something like this : MEDIA_CHOICES = ( ('Utilities', ( ('vinyl', 'Vinyl'), ('cd', 'CD'), ) ), ('Basic Materials', ( ('vhs', 'VHS Tape'), ('dvd', 'DVD'), ) ), ('Healthcare', ( ('vhs', 'VHS Tape'), ('dvd', 'DVD'), ) ), How can i defined them correctly ? – faro May 31 '17 at 21:37
  • Please NeERaj if you can help me with this question https://stackoverflow.com/questions/44302055/i-have-a-check-with-multiple-inputs-multiple-x-and-y – faro Jun 01 '17 at 08:22
  • Neeraj please i nneed your help https://stackoverflow.com/questions/44389936/radio-buttons-display-form – faro Jun 06 '17 at 14:37
  • I couldn't make a vote for you last day because i dont have enough reputation – faro Jun 06 '17 at 14:52
  • My reputation is less than 15 .. i am sorry – faro Jun 06 '17 at 14:52
  • okay i am sorry now i understand what you mean by accepting the answer. please if you can answer my question here i will be very thankful. stackoverflow.com/questions/44389936/radio-buttons-display-f‌​orm – faro Jun 07 '17 at 05:56