Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
245 views
in Technique[技术] by (71.8m points)

python - using django cleaned_data to reset data before commit to db

I started this thread and managed to figure out the issue yesterday.

However, another related issue has occurred.

When I have a 2nd select list in the model, and I select '8888' or '9999' to remove / reset the values when the form is submitted, how can I set the value of the 2nd select list to the default value?

Here is an example of the models.py code I have:

.....
DISPLAY_ONLY_AWARD_AND_GRANT_DESCRIPTION_WITH_PROMPT = 8888
DISPLAY_ONLY_AWARD_AND_GRANT_DESCRIPTION_WITHOUT_PROMPT = 9999
.....

AWARD_GRANT_TYPES = (
    (SELECT_AWARD_AND_GRANT_TYPE, _('Select Type')),
    ....
    (OTHER_GRANT, _('Other Grant')),
    (WRITE_MY_OWN_AWARD_AND_GRANT_TYPE_DESCRIPTION, _('Write my own Type description')),  #7777
    (DISPLAY_ONLY_AWARD_AND_GRANT_DESCRIPTION_WITH_PROMPT, _('Display only Description with prompt')),  #8888
    (DISPLAY_ONLY_AWARD_AND_GRANT_DESCRIPTION_WITHOUT_PROMPT, _('Display only Description without prompt')) #9999
)

....
AWARD_GRANT_DISPLAY_COMMENCEMENT_DATE_AND_COMPLETION_DATE_AS_DATE_PROMPTS = 1
....

AWARD_GRANT_DETAILS_DATE_DISPLAY_TYPES = (
    (AWARD_GRANT_DISPLAY_COMMENCEMENT_DATE_AND_COMPLETION_DATE_AS_DATE_PROMPTS, _('Display Commencement and Completion as date prompts')),
    ....
)

user = models.ForeignKey(User)
language_version = models.ForeignKey('LanguageVersion')
award_grant_type = models.PositiveIntegerField(choices=AWARD_GRANT_TYPES, default=SELECT_AWARD_AND_GRANT_TYPE, validators=[MinValueValidator(1)])
award_grant_type_description = models.CharField(null=True, blank=True, max_length=250)
award_grant_date = models.DateField(null=True, blank=True)
award_grant_date_display_type = models.PositiveIntegerField(choices=AWARD_GRANT_DETAILS_DATE_DISPLAY_TYPES, default=AWARD_GRANT_DISPLAY_COMMENCEMENT_DATE_AND_COMPLETION_DATE_AS_DATE_PROMPTS)
award_grant_description = models.TextField(null=False, blank=False, max_length=5000)

Here is my forms.py clean code that should reset the award_grant_date_display_type to 1 when the user has selected 8888 or 9999 from the select list award_grant_type before being committed to the db:

def clean(self):

    cd_agdf = super(AwardGrantDetailsForm, self).clean()

    if 'award_grant_type' in cd_agdf:
        if cd_agdf['award_grant_type'] == '':
            self._errors['award_grant_type'] = self.error_class([_("You must select a Type.")])

        elif cd_agdf['award_grant_type'] == '8888' or cd_agdf['award_grant_type'] == '9999':
            #  remove / reset the entered values when the award grant type only requires minimum data.
            self.cleaned_data.pop('award_grant_type_description', None)
            self.cleaned_data.pop('award_grant_date', None)
            self.cleaned_data['award_grant_date_display_type'] = 1 
        else:
            ....
    return cd_agdf

It appears that the line of code self.cleaned_data['award_grant_date_display_type'] = 1 is ignored and the original value retained.

I have tried placing the value in quotation marks, searched SO, Google and django docs, but I cannot figure this out.

EDIT

Here is my forms.py code as requested:

class AwardGrantDetailsForm(forms.ModelForm):

    def __init__(self, available_languages, language_preference, *args, **kwargs):
        """
        available_languages should be a valid choices list
        """
        super(AwardGrantDetailsForm, self).__init__(*args, **kwargs)
        self.fields['language_code'] = forms.ChoiceField(choices=available_languages, initial=language_preference, label=_('Language'),)
        self.fields['award_grant_date'].input_formats = (settings.DATE_INPUT_FORMATS)

    class Meta:
        model = AwardGrantDetails

        fields = (
            'award_grant_type',
            'award_grant_type_description',
            'award_grant_date',
            'award_grant_date_display_type',
            'award_grant_description',
        )

        labels = {
            'award_grant_type': _('Type'),
            'award_grant_type_description': _('Type Description'),
            'award_grant_date': _('Date'),
            'award_grant_date_display_type': _('Date Prompts'),
            'award_grant_description': _('Description'),
        }

        help_texts = {
            'award_grant_description': _('5,000 character limit'),
        }

        input_formats = {
            'award_grant_date': settings.DATE_INPUT_FORMATS,
        }

        widgets = {
            #'award_grant_description': CKEditorWidget(),
            'award_grant_date': forms.DateInput(attrs={'id': 'id_award_grant_date'}, format='%m/%Y'),
            #'award_grant_date': forms.DateInput(attrs={'id': 'id_award_grant_date'}, format=settings.DATE_INPUT_FORMATS),
        }

        error_messages = {
            'award_grant_type': {'validate_min': _('This field is required.')}, #  validate_min used on award_grant_type in lieu of required field.
        }

EDIT

Here is my views.py code as requested:

@login_required
@resume_menu_required(entry_number=settings.MENU_DETAIL_VALUE_AWARD_GRANT_DETAILS)
@complete_profile_required
def award_grant_details_edit(request, award_grant_details_id):
    try:
        award_grant_details = AwardGrantDetails.objects.get(pk=award_grant_details_id, user=request.user)
    except AwardGrantDetails.DoesNotExist:
        return redirect(settings.MENU_DETAIL_LINK_AWARD_GRANT_DETAILS)
    language_versions = LanguageVersion.objects.filter(user=request.user).select_related('language_version')
    available_languages = get_available_language_details(language_versions, request.user.userprofile.language_preference)
    award_grant_details_num = request.user.awardgrantdetails_set.count()
    language_code = award_grant_details.language_version.language_code
    language_code_disabled = award_grant_details.language_version.language_code_disabled
    preview_labels = get_award_grant_types(available_languages)
    selected_resume_menu_entries = (request.user.userprofile.selected_resume_menu_entries)
    if language_code_disabled:
        return redirect(settings.MENU_DETAIL_LINK_AWARD_GRANT_DETAILS)
    if request.method == 'GET':
        language_code = award_grant_details.language_version.language_code
        form = AwardGrantDetailsForm(
            available_languages=available_languages,
            language_preference=request.user.userprofile.language_preference,
            initial=dict(model_to_dict(award_grant_details), language_code=language_code))
    elif request.method == 'POST':
        form = AwardGrantDetailsForm(
            available_languages=available_languages,
            language_preference=request.user.userprofile.language_preference,
            data=request.POST)
        if form.is_valid():
            award_grant_details.fill(form.cleaned_data)
            award_grant_details.save()
            messages.success(request, _('successfully updated.'))
            return redirect(settings.MENU_DETAIL_LINK_AWARD_GRANT_DETAILS)
    return render(request,'resume_details/award_grant_details_edit.html',{
        'address_details_count': get_address_details_count(request.user),
        'award_grant_details': award_grant_details,
        'award_grant_details_num': award_grant_details_num,
        'contact_details_count': get_contact_details_count(request.user),
        'display_default_language': display_default_language(request.user),
        'form': form,
        'language_versions': get_language_versions(user=request.user),
        'language_versions_num': len(language_versions),  # the count of all users Language Versions (enabled & disabled).
        'languages': LANGUAGES,
        'max_award_grant_details': settings.MAX_AWARD_GRANT_DETAILS,
        'max_details_count': settings.MAX_AWARD_GRANT_DETAILS,
        'name_details_count': get_name_details_count(request.user),
        'preview_labels': preview_labels,
        'resume_details_menu_link': settings.MENU_DETAIL_LINK_AWARD_GRANT_DETAILS,
        'resume_details_menu_num': settings.MENU_DETAIL_VALUE_AWARD_GRANT_DETAILS,
        'selected_resume_menu_entries': selected_resume_menu_entries,
    })
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

I never discovered the answer to this issue.

However, a workaround is that on form submit when 8888 or 9999 is selected and there are no errors, I manually set the value to 1 using jquery:

$('#id_of_element_type').val('1');

I hope that this will assist someone.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

56.8k users

...