Opened 8 years ago

Last modified 7 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 8 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 8 years ago by Jannis Leidel

Triage Stage: UnreviewedAccepted

comment:2 Changed 8 years ago by vanessagomes

Owner: changed from nobody to vanessagomes

comment:3 Changed 8 years ago by vanessagomes

Owner: vanessagomes deleted

comment:4 Changed 8 years ago by vanessagomes

Owner: set to vanessagomes

comment:5 Changed 8 years ago by Chris Beaven

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 8 years ago by Chris Beaven

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

One may assume the command should always create the app folder (i.e. move the contents of django/conf/template to django/conf/template/app_name). Unfortunately, it's not that easy - because then without a target, you'd end up with app_name/app_name

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

The more consistent way would be to always create the app_name subdirectory when dealing with an explicit target. Again though, this changes the contract from the current behaviour.

Last edited 8 years ago by Chris Beaven (previous) (diff)

comment:7 Changed 8 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 8 years ago by Harro

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 8 years ago by vanessagomes

Attachment: ticket18296.diff added

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

comment:9 Changed 8 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 8 years ago by Preston Holmes

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 8 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 7 years ago by anonymous

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

comment:13 Changed 7 years ago by anonymous

Resolution: fixed
Status: newclosed
Version: 1.41.5
mkdir Apps\newapp
python startapp NewApp Apps/newapp
python startapp myApp ./Apps/myApp


comment:14 Changed 7 years ago by Aymeric Augustin

Resolution: fixed
Status: closednew

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