Opened 4 years ago

Last modified 3 years ago

#18296 new Cleanup/optimization

Make creating apps inside project folder more intuitive with startapp command

Reported by: lgp171188@… Owned by: vanessagomes
Component: Core (Management commands) Version: 1.5
Severity: Normal Keywords:, startapp
Cc: vanessagomes Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: yes Patch needs improvement: no
Easy pickings: no UI/UX: no


The structure of the project created by ' startproject' has changed from Django 1.4. The '' file is at the same level where the project folder containing, is present. In order to create an app within the project as was possible with Django < 1.4, the command to be used is 'python startapp <app name> <destination folder which is optional>. So if I execute the command "python startapp myapp myproject", there is an error that says "Error: <full path>/<project name>/<project name>/ already exists, overlaying a project or app into an existing directory won't replace conflicting files". The command actually expects an empty directory having the name of the app inside the project directory to work correctly. So the user has to create that directory and then create the app. This isn't very intuitive and django should create the app directory if it doesn't exist and then create the app to show the same behaviour as the previous versions.

One other way to work around this behaviour is to change to the project directory and then execute python ../ startapp appname.

Attachments (1)

ticket18296.diff (3.1 KB) - added by vanessagomes 4 years ago.
I'm sorry guys, it was another ticket that I was soluting, and it came together. Now is the right patch.

Download all attachments as: .zip

Change History (15)

comment:1 Changed 4 years ago by jezdez

  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement unset
  • Triage Stage changed from Unreviewed to Accepted

comment:2 Changed 4 years ago by vanessagomes

  • Owner changed from nobody to vanessagomes

comment:3 Changed 4 years ago by vanessagomes

  • Owner vanessagomes deleted

comment:4 Changed 4 years ago by vanessagomes

  • Owner set to vanessagomes

comment:5 Changed 4 years ago by SmileyChris

I agree that it's pretty unintuitive.

Both commands use the same base class, but it doesn't take into acount that creating a project involves creating a workspace containing the project module, whereas an app is nothing *but* the module -- you can't put an app named 'app1' in anything but an app1 directory.

comment:6 Changed 4 years ago by SmileyChris

Talking with Vanessa, we teased out the backwards incompatibilities of always creating the app folder.

One solution is to only create the app folder if the target folder name differs. This means that we keep backwards compatibility, but at the cost of less consistent behaviour.

The other one is that we just assume the command should always create the app folder. The easiest way to do this would be to move the contents of django/conf/template to django/conf/template/app_name. This would change the format from that implemented by any existing third-party app templates, but that's not the end of the world.

I'm leaning towards simply moving the templates inside app_name.

Version 1, edited 4 years ago by SmileyChris (previous) (next) (diff)

comment:7 Changed 4 years ago by vanessagomes

  • Cc vanessagomes added
  • Easy pickings unset
  • Has patch set

It was created a method who get the target's directory. And in, the get_target_dir() was overrided to deal with this special issue.

So, when you use

python startapp myapp1


python startapp myapp2 myproject

It's working well.

comment:8 Changed 4 years ago by hvdklauw

  • Patch needs improvement set

Why is the get_backend_info stuff in the diff? It's totally unrelated. You might have accidentally left another patch in there.

Changed 4 years ago by vanessagomes

I'm sorry guys, it was another ticket that I was soluting, and it came together. Now is the right patch.

comment:9 Changed 4 years ago by vanessagomes

  • Cc vanessagomes removed
  • Patch needs improvement unset

I replaced the old patch, and Now we have the right patch.

comment:10 Changed 4 years ago by ptone

  • Needs tests set

Thanks for the work on this.

To be clear, this is not a bug. For the currently documented behavior, this should never work:

(django-dev)element:tmp$ startproject myproject
(django-dev)element:tmp$ cd myproject
(django-dev)element:myproject$ ./ startapp myapp myproject

Because the destination argument to startapp should be a folder *into which* the app package contents are injected, not a containing folder, if that sequence ran without error, it would result in an app and a project inside the same python package (sharing a single init, having a next to a etc).

The docs are: "If the optional destination is provided, Django will use that existing directory rather than creating a new one. You can use '.' to denote the current working directory."

If you instead meant:

./ startapp myapp myproject/somedir

you instead get an error about the directory not existing and to create it first - I'm not sure that Django shouldn't just create it if it doesn't exist - that would be a different ticket.

If you see a way to clarify the docs on this, perhaps a documentation ticket could be opened as well?

I see doing:

cd myproject
../ startapp myapp
or startapp myapp

as preferable to a backwards incompatible design change as proposed by the patch - but that is getting into DDN territory...

comment:11 Changed 4 years ago by vanessagomes

  • Cc vanessagomes added

I think we should open a new ticket about the docs, so we can discuss if we should change a little bit of...

comment:12 Changed 3 years ago by anonymous

this link might be useful to Create an app in a sub-directory :

comment:13 Changed 3 years ago by anonymous

  • Resolution set to fixed
  • Status changed from new to closed
  • Version changed from 1.4 to 1.5
mkdir Apps\newapp
python startapp NewApp Apps/newapp
python startapp myApp ./Apps/myApp


comment:14 Changed 3 years ago by aaugustin

  • Resolution fixed deleted
  • Status changed from closed to new

The discussion above contains several ideas that weren't taken into account or rejected; the ticket isn't fixed until we make a decision.

Note: See TracTickets for help on using tickets.
Back to Top